Partager via


Expression de chemin JSON

S’applique à : case marquée oui Databricks SQL case marquée oui Databricks Runtime

Une expression de chemin d’accès JSON est utilisée pour extraire des valeurs d’une chaîne JSON à l’aide de l’opérateur : (deux-points).

Syntaxe

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

Les crochets entourant field, * et index sont des crochets réels et n’indiquent pas une syntaxe facultative.

Paramètres

  • identificateur : identificateur ne respectant pas la casse d’un champ JSON.
  • [ field ] : littéral de type STRING respectant la casse entre crochets identifiant un champ JSON.
  • [ * ] : identification de tous les éléments figurant dans un tableau JSON.
  • [ index ] : littéral entier identifiant un élément spécifique dans un tableau JSON basé sur zéro.

Retours

CHAÎNE.

Quand il existe un champ JSON avec une valeur null non délimitée, vous recevez une valeur SQL NULL pour cette colonne, non une valeur de texte null.

Vous pouvez utiliser l’opérateur :: pour caster les valeurs en types de données de base.

Utilisez la fonction from_json pour caster des résultats imbriqués en types de données plus complexes, tels que des tableaux ou des structs.

Notes

Vous pouvez utiliser un identificateur non délimité pour référencer un champ JSON si le nom ne contient pas d’espaces ni de caractères spéciaux et s’il n’existe aucun champ du même nom dans une casse différente.

Utilisez un identificateur délimité s’il n’existe aucun champ du même nom dans une casse différente.

La notation [ field ] peut toujours être utilisée, mais vous oblige à respecter exactement la casse du champ.

Si Databricks SQL ne peut pas identifier un champ de manière unique, une erreur est renvoyée. Si aucune correspondance n’est trouvée pour un champ, Databricks SQL renvoie NULL.

Exemples

Les exemples suivants utilisent les données créées avec l’instruction dans Exemple de données.

Dans cette section :

Extraire à l’aide d’un identificateur et de délimiteurs

> 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

Extraire les champs imbriqués

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

Extraire des valeurs des tableaux

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

Comportement NULL

> SELECT '{"key":null}':key IS NULL sql_null, '{"key":"null"}':key IS NULL;
  true          false

Convertir les valeurs

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

Exemple de données

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