{ { 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
    
  • : 运算符
  •