{ { identifier | [ field ] | [ * ] | [ index ] }
[ . identifier | [ field ] | [ * ] | [ index ] ] [...] }
field
、*
和 index
周围的括号是实际括号,并不表示可选语法。
parameters
标识符:JSON 字段的不区分大小写的标识符。
[ field ]
:括号中区分大小写的 STRING 文本,用于标识 JSON 字段。
[ * ]
:用于标识 JSON 数组中的所有元素。
[ index ]
:一个整数文本,用于标识基于 0 的 JSON 数组中的特定元素。
一个 STRING。
如果存在具有未分隔的 null
值的 JSON 字段,则会收到该列的 SQL NULL
值,而不是 null
文本值。
可以使用 :: 运算符将值转换为基本数据类型。
使用 from_json 函数将嵌套结果转换为更复杂的数据类型,例如数组或结构。
如果名称不包含空格或特殊字符,并且不存在不同大小写的同名字段,则可以使用未分隔的标识符来引用 JSON 字段。
如果不存在不同大小写的同名字段,请使用分隔标识符。
[ field ]
表示法始终可以使用,但需要与字段的大小写完全匹配。
如果 Databricks SQL 无法唯一地标识字段,则会返回错误。 如果未找到任何字段的匹配项,Databricks SQL 将返回 NULL
。
下面的示例使用在示例数据中通过语句创建的数据。
本节内容:
使用标识符和分隔符进行提取
提取嵌套字段
从数组中提取值
NULL 行为
强制转换值
使用标识符和分隔符进行提取
> SELECT raw:owner, raw:OWNER, raw:['owner'], raw:['OWNER'] FROM store_data;
amy amy amy NULL
-- Use backticks to escape special characters. References are case insensitive when you use backticks.
-- Use brackets to make them case sensitive.
> SELECT raw:`zip code`, raw:`Zip Code`, raw:['fb:testid'] FROM store_data;
94025 94025 1234
-- Use dot notation
> SELECT raw:store.bicycle FROM store_data;
'{ "price":19.95, "color":"red" }'
-- Use brackets
> SELECT raw:['store']['bicycle'] FROM store_data;
'{ "price":19.95, "color":"red" }'
-- Index elements
> SELECT raw:store.fruit[0], raw:store.fruit[1] FROM store_data;
'{ "weight":8, "type":"apple" }' '{ "weight":9, "type":"pear" }'
-- Extract subfields from arrays
> SELECT raw:store.book[*].isbn FROM store_data;
'[ null, "0-553-21311-3", "0-395-19395-8" ]'
-- Access arrays within arrays or structs within arrays
> SELECT raw:store.basket[*],
raw:store.basket[*][0] first_of_baskets,
raw:store.basket[0][*] first_basket,
raw:store.basket[*][*] all_elements_flattened,
raw:store.basket[0][2].b subfield
FROM store_data;
basket first_of_baskets first_basket all_elements_flattened subfield
---------------------------- ------------------ --------------------- --------------------------------- ----------
[ [ [ [1,2,{"b":"y","a":"x"},3,4,5,6] y
[1,2,{"b":"y","a":"x"}], 1, 1,
[3,4], 3, 2,
[5,6] 5 {"b":"y","a":"x"}
] ] ]
NULL 行为
> SELECT '{"key":null}':key IS NULL sql_null, '{"key":"null"}':key IS NULL;
true false
强制转换值
-- price is returned as a double, not a string
> SELECT raw:store.bicycle.price::double FROM store_data
19.95
-- use from_json to cast into more complex types
> SELECT from_json(raw:store.bicycle, 'price double, color string') bicycle FROM store_data
'{ "price":19.95, "color":"red" }'
-- the column returned is an array of string arrays
> SELECT from_json(raw:store.basket[*], 'array<array<string>>') baskets FROM store_data
["1","2","{\"b\":\"y\",\"a\":\"x\"}]",
["3","4"],
["5","6"]
CREATE TABLE store_data AS SELECT
"store":{
"fruit": [
{"weight":8,"type":"apple"},
{"weight":9,"type":"pear"}
"basket":[
[1,2,{"b":"y","a":"x"}],
[3,4],
[5,6]
"book":[
"author":"Nigel Rees",
"title":"Sayings of the Century",
"category":"reference",
"price":8.95
"author":"Herman Melville",
"title":"Moby Dick",
"category":"fiction",
"price":8.99,
"isbn":"0-553-21311-3"
"author":"J. R. R. Tolkien",
"title":"The Lord of the Rings",
"category":"fiction",
"reader":[
{"age":25,"name":"bob"},
{"age":26,"name":"jack"}
"price":22.99,
"isbn":"0-395-19395-8"
"bicycle":{
"price":19.95,
"color":"red"
"owner":"amy",
"zip code":"94025",
"fb:testid":"1234"
}' as raw
: 运算符