共用方式為


JSON 路徑表達式

適用於:核取記號為「是」Databricks SQL 核取記號為「是」Databricks Runtime

JSON 路徑表示式可用來從 JSON 字串或 VARIANT 中使用 :運算子 擷取值。

語法

{ { identifier | [ field ] | [ * ] | [ index ] }
  [ . identifier | [ field ] | [ * ] | [ index ] ] [...] }

field*index 周圍的括號是實際的方括號,而不是表示選擇性語法。

參數

  • identifier:JSON 字段的標識符。 針對 JSON STRING 類型,標識元不區分大小寫。 針對 VARIANT 類型,它會區分大小寫。
  • [ field ]:用括號括住的區分大小寫的STRING文字串,用於識別 JSON 欄位。
  • [ * ]:識別 JSON 陣列中的所有元素。 不支援 VARIANT此語法。
  • [ index ]:整數常值,識別以 0 為基礎的 JSON 陣列中的特定元素。

退貨

STRING如果巡覽的表示式是 ,則為 STRING。 如果正在巡覽的表示式是 VARIANT,則為 VARIANT

當 JSON 欄位存在且 null 的值未經分隔時,您將收到該資料列中的 SQL NULL 值,而不是 null 文本值。

您可以使用 :: 運算子 ,將值轉換成基本數據類型。

使用 from_json 函式,將巢狀結果轉換成更複雜的數據類型,例如陣列或結構。

備註

如果名稱不包含空格或特殊字元,則可以使用未分隔的標識碼來參考 JSON 欄位,而且在不同案例中,相同名稱的 JSON STRING 中沒有字段。

如果不同大小寫中沒有相同名稱的欄位,請使用分隔標識碼。

符號 [ field ] 一律可以使用,但需要您完全符合欄位的大小寫。

如果 Azure Databricks 無法唯一識別某個欄位,將會傳回錯誤。 如果找不到任何欄位的相符專案,Azure Databricks 會回傳 NULL

NULL 值可以在 VARIANT 內編碼,而該值不是 SQL NULL。 因此,parse_json('null') IS NULLfalse,但 is_variant_null(parse_json('null'))trueVARIANT編碼的 Null 可以轉換成 SQLNULL,方法是將它轉換成某種類型。 例如,parse_json('null')::int IS NULLtrue

範例

下列範例會使用在範例資料中使用語句建立的資料。

本節內容:

使用標識碼和分隔符進行擷取

> 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"}
  ]                            ]                  ]

空值行為

> 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
  1.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"]
  ]'

變體表達式

-- Using JSON paths for VARIANT
> SELECT raw:store.bicycle FROM store_data_variant;
  '{ "price":19.95, "color":"red" }'

-- Extracting from VARIANT arrays
> SELECT raw:store.fruit[0], raw_variant:store.fruit[1] FROM store_data_variant;
  '{ "weight":8, "type":"apple" }'  '{ "weight":9, "type":"pear" }'

-- SQL NULL behavior of VARIANT NULL values
> SELECT
  parse_json(NULL) IS NULL AS sql_null,
  parse_json('null') IS NULL AS variant_null,
  parse_json('{ "field_a": null }'):field_a IS NULL AS variant_null_value,
  parse_json('{ "field_a": null }'):missing IS NULL AS missing_sql_value_null
  true  false  false  true

-- price is returned as a double, not a VARIANT
> SELECT raw:store.bicycle.price::double FROM store_data_variant
  1.95

範例資料

> 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

 > CREATE TABLE store_data_variant AS SELECT parse_json(raw) FROM store_data;