تعبير مسار JSON

ينطبق على: وضع علامة Databricks SQL وضع علامة Databricks Runtime

يتم استخدام تعبير مسار JSON لاستخراج القيم من سلسلة JSON أو VARIANT باستخدام عامل التشغيل :

بناء الجملة

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

الأقواس المحيطة field، * و index هي أقواس فعلية ولا تشير إلى بناء جملة اختياري.

المعلمات

  • المعرف: معرف لحقل JSON. بالنسبة إلى أنواع JSON STRING ، يكون المعرف غير حساس لحالة الأحرف. بالنسبة للأنواح VARIANT ، يكون حساسا لحالة الأحرف.
  • [ field ]: قيمة حرفية حساسة STRING لحالة الأحرف بين قوسين تحدد حقل JSON.
  • [ * ]: تحديد جميع العناصر في صفيف JSON. بناء الجملة هذا غير معتمد ل VARIANT.
  • [ index ]: عدد صحيح حرفي يحدد عنصرا معينا في صفيف JSON يستند إلى 0.

المرتجعات

إذا 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 NULL هو false، ولكن is_variant_null(parse_json('null')) هو true. VARIANT يمكن تحويل القيمة الخالية المشفرة إلى SQL NULL عن طريق تحويلها إلى نوع ما. على سبيل المثال، parse_json('null')::int IS NULL هو true.

الأمثلة

تستخدم الأمثلة التالية البيانات التي تم إنشاؤها باستخدام العبارة في بيانات المثال.

في هذا القسم:

استخراج باستخدام المعرف والمحددات

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

تعبيرات VARIANT

-- 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
  19.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;