PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 15.14 » Langage SQL » Fonctions et opérateurs » Fonctions et opérateurs JSON

9.16. Fonctions et opĂ©rateurs JSON

Cette section dĂ©crit :

  • les fonctions et opĂ©rateurs pour traiter et crĂ©er des donnĂ©es JSON

  • le langage de chemin SQL/JSON

Pour en savoir plus sur le standard SQL/JSON, voir [sqltr-19075-6]. Pour des dĂ©tails sur les types JSON supportĂ©s dans PostgreSQL, voir Section 8.14.

9.16.1. Traiter et crĂ©er des donnĂ©es JSON

Tableau 9.45 affiche les opĂ©rateurs disponibles pour les types de donnĂ©es JSON (voir Section 8.14). De plus, les opĂ©rateurs de comparaison habituels indiquĂ©s dans Tableau 9.1 sont disponibles pour le type jsonb, mais pas pour le type json. Les opĂ©rateurs de comparaison suivent les rĂšgles de tri des opĂ©rateurs B-tree indiquĂ©s dans Section 8.14.4. Voir aussi Section 9.21 pour la fonction d'agrĂ©gat json_agg qui agrĂšge les valeurs d'enregistrements sous la forme d'un JSON, pour la fonction d'agrĂ©gat json_object_agg qui agrĂšge des paires de valeurs dans un objet JSON, et leurs Ă©quivalents jsonb, Ă  savoir jsonb_agg et jsonb_object_agg.

Tableau 9.45. OpĂ©rateurs json et jsonb

Opérateur

Description

Exemple(s)

json -> integer → json

jsonb -> integer → jsonb

Extrait le n-iÚme élément d'un tableau JSON (les éléments du tableau sont indexés à partir de zéro, mais les nombres négatifs sont pris en compte à partir de la fin).

'[{"a":"foo"},{"b":"bar"},{"c":"baz"}]'::json -> 2 → {"c":"baz"}

'[{"a":"foo"},{"b":"bar"},{"c":"baz"}]'::json -> -3 → {"a":"foo"}

json -> text → json

jsonb -> text → jsonb

Extrait le champ objet JSON avec la clé donnée.

'{"a": {"b":"foo"}}'::json -> 'a' → {"b":"foo"}

json ->> integer → text

jsonb ->> integer → text

Extrait le n-iÚme élément d'un tableau JSON, comme le text.

'[1,2,3]'::json ->> 2 → 3

json ->> text → text

jsonb ->> text → text

Extrait le champ objet JSON d'aprÚs la clé donnée, comme text.

'{"a":1,"b":2}'::json ->> 'b' → 2

json #> text[] → json

jsonb #> text[] → jsonb

Extrait le sous-objet JSON d'un chemin spĂ©cifiĂ©, oĂč les Ă©lĂ©ments du chemin peuvent ĂȘtre soit les clĂ©s d'un champ, soit les indices d'un tableau.

'{"a": {"b": ["foo","bar"]}}'::json #> '{a,b,1}' → "bar"

json #>> text[] → text

jsonb #>> text[] → text

Extrait le sous-objet JSON au chemin spécifié avec text.

'{"a": {"b": ["foo","bar"]}}'::json #>> '{a,b,1}' → bar


Note

Les opĂ©rateurs d'extraction champ/Ă©lĂ©ment/chemin renvoient NULL, plutĂŽt qu'une erreur, si l'entrĂ©e JSON n'a pas la bonne structure correspondant Ă  la requĂȘte ; par exemple si la clĂ© ou l'Ă©lĂ©ment du tableau n'existe pas.

Quelques opĂ©rateurs supplĂ©mentaires existent seulement pour le type jsonb, comme indiquĂ© dans Tableau 9.46. Section 8.14.4 dĂ©crit comment ces opĂ©rateurs peuvent ĂȘtre utilisĂ©s pour rechercher efficacement les donnĂ©es jsonb indexĂ©es.

Tableau 9.46. OpĂ©rateurs jsonb supplĂ©mentaires

Opérateur

Description

Exemple(s)

jsonb @> jsonb → boolean

Est-ce que la premiĂšre valeur JSON contient la seconde ? (Voir Section 8.14.3 pour les dĂ©tails sur la notion de contenu.)

'{"a":1, "b":2}'::jsonb @> '{"b":2}'::jsonb → t

jsonb <@ jsonb → boolean

Est-ce que la premiĂšre valeur JSON est contenue dans la seconde ?

'{"b":2}'::jsonb <@ '{"a":1, "b":2}'::jsonb → t

jsonb ? text → boolean

Est-ce que la chaĂźne de caractĂšres existe comme clĂ© de haut niveau ou Ă©lĂ©ment de tableau dans la valeur JSON ?

'{"a":1, "b":2}'::jsonb ? 'b' → t

'["a", "b", "c"]'::jsonb ? 'b' → t

jsonb ?| text[] → boolean

Est-ce qu'une des chaĂźnes du tableau de texte existe comme clĂ© de haut niveau ou comme Ă©lĂ©ment de tableau ?

'{"a":1, "b":2, "c":3}'::jsonb ?| array['b', 'd'] → t

jsonb ?& text[] → boolean

Est-ce que toutes les chaĂźnes du tableau de texte existent comme clĂ©s de haut niveau ou comme Ă©lĂ©ments de tableau ?

'["a", "b", "c"]'::jsonb ?& array['a', 'b'] → t

jsonb || jsonb → jsonb

ConcatĂšne deux valeurs jsonb. ConcatĂ©ner deux tableaux gĂ©nĂšre un tableau contenant tous les Ă©lĂ©ments de chaque entrĂ©e. ConcatĂ©ner deux objets gĂ©nĂšre un objet contenant l'union de leurs clĂ©s, en prenant la valeur du deuxiĂšme objet quand il existe deux clĂ©s dupliquĂ©es. Tous les autres cas sont traitĂ©s en convertissant une entrĂ©e non tableau en un tableau Ă  un seul Ă©lĂ©ment, puis en le traitant comme pour deux tableaux. N'est pas rĂ©cursif : seul le tableau ou la structure objet de haut niveau est assemblĂ©.

'["a", "b"]'::jsonb || '["a", "d"]'::jsonb → ["a", "b", "a", "d"]

'{"a": "b"}'::jsonb || '{"c": "d"}'::jsonb → {"a": "b", "c": "d"}

'[1, 2]'::jsonb || '3'::jsonb → [1, 2, 3]

'{"a": "b"}'::jsonb || '42'::jsonb → [{"a": "b"}, 42]

Pour concaténer un tableau à un autre tableau dans une entrée unique, il faut l'envelopper dans une couche supplémentaire de tableau, par exemple :

'[1, 2]'::jsonb || jsonb_build_array('[3, 4]'::jsonb) → [1, 2, [3, 4]]

jsonb - text → jsonb

Supprime une clé (et sa valeur) à partir d'un objet JSON, ou les valeurs correspondantes de chaßnes à partir d'un tableau JSON.

'{"a": "b", "c": "d"}'::jsonb - 'a' → {"c": "d"}

'["a", "b", "c", "b"]'::jsonb - 'b' → ["a", "c"]

jsonb - text[] → jsonb

Supprime toutes les clés ou tous les éléments de tableau correspondant à partir de l'opérande gauche.

'{"a": "b", "c": "d"}'::jsonb - '{a,c}'::text[] → {}

jsonb - integer → jsonb

Supprime l'élément de tableau pour l'index spécifié (les nombres négatifs se décomptent à partir de la fin). Renvoie une erreur si la valeur JSON n'est pas un tableau.

'["a", "b"]'::jsonb - 1 → ["a"]

jsonb #- text[] → jsonb

Supprime le champ ou l'Ă©lĂ©ment de tableau sur le chemin indiquĂ©, les Ă©lĂ©ments du chemin pouvant ĂȘtre soit des clĂ©s de champ, soit des indices de tableau.

'["a", {"b":1}]'::jsonb #- '{1,b}' → ["a", {}]

jsonb @? jsonpath → boolean

Est-ce que le chemin JSON renvoie tout Ă©lĂ©ment pour la valeur JSON spĂ©cifiĂ©e ?

'{"a":[1,2,3,4,5]}'::jsonb @? '$.a[*] ? (@ > 2)' → t

jsonb @@ jsonpath → boolean

Renvoie le résultat d'une vérification de prédicat du chemin JSON pour la valeur JSON indiquée. Seul le premier élément du résultat est pris en compte. Si le résultat n'est pas un booléen, alors NULL est renvoyé.

'{"a":[1,2,3,4,5]}'::jsonb @@ '$.a[*] > 2' → t


Note

Les opĂ©rateurs @? et @@ du type jsonpath suppriment les erreurs suivantes : champ objet ou Ă©lĂ©ment de tableau manquant, type d'Ă©lĂ©ment JSON inattendu, erreurs de date/heure ou de numĂ©rique. Les fonctions relatives Ă  jsonpath dĂ©crites ci-dessous peuvent aussi supprimer ce type d'erreurs Ă  la demande. Ce comportement pourrait ĂȘtre utile lors de la recherche de collections de documents JSON de diffĂ©rentes structures.

Tableau 9.47 montre les fonctions disponibles pour construire des valeurs json et jsonb.

Tableau 9.47. Fonctions de crĂ©ation de JSON

Fonction

Description

Exemple(s)

to_json ( anyelement ) → json

to_jsonb ( anyelement ) → jsonb

Convertit toute valeur SQL en json ou jsonb. Les tableaux et valeurs composites sont convertis rĂ©cursivement en tableaux et en objets (les tableaux multidimensionnels deviennent des tableaux de tableaux en JSON). Sinon, s'il existe une conversion entre le type de donnĂ©es SQL et json, la fonction de conversion sera utilisĂ©e pour rĂ©aliser la conversion ;[a] sinon, une valeur JSON scalaire est produite. Pour tout scalaire autre qu'un nombre, un boolĂ©en ou une valeur NULL, la reprĂ©sentation textuelle sera utilisĂ©e avec les Ă©chappements nĂ©cessaires pour la transformer en valeur JSON valide.

to_json('Fred said "Hi."'::text) → "Fred said \"Hi.\""

to_jsonb(row(42, 'Fred said "Hi."'::text)) → {"f1": 42, "f2": "Fred said \"Hi.\""}

array_to_json ( anyarray [, boolean ] ) → json

Convertit un tableau SQL en tableau JSON. Le comportement est le mĂȘme que to_json sauf que des sauts de ligne seront ajoutĂ©s entre les Ă©lĂ©ments de tableau de haut niveau si le paramĂštre boolĂ©en optionnel vaut true.

array_to_json('{{1,5},{99,100}}'::int[]) → [[1,5],[99,100]]

row_to_json ( record [, boolean ] ) → json

Convertit une valeur composite SQL en objet JSON. Le comportement est le mĂȘme que to_json sauf que des sauts de ligne seront ajoutĂ©s entre les Ă©lĂ©ments de tableau de haut niveau si le paramĂštre boolĂ©en optionnel vaut true.

row_to_json(row(1,'foo')) → {"f1":1,"f2":"foo"}

json_build_array ( VARIADIC "any" ) → json

jsonb_build_array ( VARIADIC "any" ) → jsonb

Construit un tableau JSON avec des types potentiellement hétérogÚnes à partir d'une liste d'arguments de longueur variable. Chaque argument est converti avec la fonction to_json ou to_jsonb.

json_build_array(1, 2, 'foo',4,5) → [1, 2, "foo", 4, 5]

json_build_object ( VARIADIC "any" ) → json

jsonb_build_object ( VARIADIC "any" ) → jsonb

Construit un objet JSON Ă  partir d'une liste d'arguments de longueur indĂ©finie. Par convention, la liste d'arguments consiste en des clĂ©s et valeurs en alternance. Les arguments clĂ©s sont convertis en texte ; les arguments valeurs sont convertis via les fonctions to_json ou to_jsonb.

json_build_object('foo', 1, 2, row(3, 'bar')) → {"foo" : 1, "2" : {"f1":3,"f2":"bar"}}

json_object ( text[] ) → json

jsonb_object ( text[] ) → jsonb

Construit un objet JSON à partir d'un tableau de texte. Le tableau doit avoir soit exactement une dimension avec un nombre pair de membres, auquel cas ils sont pris comme des paires alternantes clé/valeur, ou deux dimensions de telle façon que le tableau interne a exactement deux éléments, pris comme une paire clé/valeur. Toutes les valeurs sont converties en chaßne JSON.

json_object('{a, 1, b, "def", c, 3.5}') → {"a" : "1", "b" : "def", "c" : "3.5"}

json_object('{{a, 1}, {b, "def"}, {c, 3.5}}') → {"a" : "1", "b" : "def", "c" : "3.5"}

json_object ( keys text[], values text[] ) → json

jsonb_object ( keys text[], values text[] ) → jsonb

Cette forme de json_object prend les clés et valeurs à partir de tableaux de texte séparés. Pour le reste, elle est identique à la forme à un argument.

json_object('{a, b}', '{1,2}') → {"a": "1", "b": "2"}

[a] Par exemple, l'extension hstore contient une conversion de hstore vers json, pour que les valeurs hstore converties par les fonctions de création JSON soient représentées en tant qu'objets JSON, et non pas comme des valeurs de type chaßne de caractÚres.


Tableau 9.48 montre les fonctions disponibles pour le traitement de valeurs json et jsonb.

Tableau 9.48. Fonctions de traitement JSON

Fonction

Description

Exemple(s)

json_array_elements ( json ) → setof json

jsonb_array_elements ( jsonb ) → setof jsonb

Étend le tableau JSON de haut niveau en un ensemble de valeurs JSON.

select * from json_array_elements('[1,true, [2,false]]') →

   value
-----------
 1
 true
 [2,false]
       

json_array_elements_text ( json ) → setof text

jsonb_array_elements_text ( jsonb ) → setof text

Étend le tableau JSON de haut niveau en un ensemble de valeurs de type text.

select * from json_array_elements_text('["foo", "bar"]') →

   value
-----------
 foo
 bar
       

json_array_length ( json ) → integer

jsonb_array_length ( jsonb ) → integer

Renvoie le nombre d'éléments dans le tableau JSON de haut niveau.

json_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]') → 5

jsonb_array_length('[]') → 0

json_each ( json ) → setof record ( key text, value json )

jsonb_each ( jsonb ) → setof record ( key text, value jsonb )

Étend l'objet JSON de haut niveau en un ensemble de paires clĂ©/valeur.

select * from json_each('{"a":"foo", "b":"bar"}') →

 key | value
-----+-------
 a   | "foo"
 b   | "bar"
       

json_each_text ( json ) → setof record ( key text, value text )

jsonb_each_text ( jsonb ) → setof record ( key text, value text )

Étend l'objet JSON de haut niveau en un ensemble de paires clĂ©/valeur. Les value renvoyĂ©es seront de type text.

select * from json_each_text('{"a":"foo", "b":"bar"}') →

 key | value
-----+-------
 a   | foo
 b   | bar
       

json_extract_path ( from_json json, VARIADIC path_elems text[] ) → json

jsonb_extract_path ( from_json jsonb, VARIADIC path_elems text[] ) → jsonb

Extrait un sous-objet JSON au chemin spĂ©cifiĂ©. (Ceci est fonctionnellement Ă©quivalent Ă  l'opĂ©rateur #>, mais Ă©crire le chemin sous la forme d'une liste peut ĂȘtre plus agrĂ©able dans certains cas.)

json_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}', 'f4', 'f6') → "foo"

json_extract_path_text ( from_json json, VARIADIC path_elems text[] ) → text

jsonb_extract_path_text ( from_json jsonb, VARIADIC path_elems text[] ) → text

Extrait le sous-objet JSON au chemin spécifié sous la forme d'un text. (Ceci est équivalent fonctionnement à l'opérateur #>>.)

json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}', 'f4', 'f6') → foo

json_object_keys ( json ) → setof text

jsonb_object_keys ( jsonb ) → setof text

Renvoie l'ensemble de clés dans l'objet JSON de haut niveau.

select * from json_object_keys('{"f1":"abc","f2":{"f3":"a", "f4":"b"}}') →

 json_object_keys
------------------
 f1
 f2
       

json_populate_record ( base anyelement, from_json json ) → anyelement

jsonb_populate_record ( base anyelement, from_json jsonb ) → anyelement

Étend l'objet JSON de haut niveau en une ligne ayant le type composite de l'argument base. L'objet JSON est parcouru pour y trouver les champs dont le nom correspond aux noms de colonnes du type de la ligne en sortie, et leurs valeurs sont insĂ©rĂ©es dans ces colonnes en sortie. (Les champs qui ne correspondent Ă  aucun nom de colonne en sortie sont ignorĂ©s.) Dans le cas d'une utilisation typique, la valeur de base est simplement NULL, ce qui signifie que toute colonne en sortie qui ne correspond pas Ă  un champ d'objet sera remplie avec un NULL. NĂ©anmoins, si base ne vaut pas NULL, alors les valeurs qu'il contient seront utilisĂ©es pour les colonnes sans correspondance.

Pour convertir une valeur JSON au type SQL d'une colonne en sortie, les rĂšgles suivantes sont appliquĂ©es sur cette sĂ©quence :

  • Une valeur JSON null est convertie en NULL SQL dans tous les cas.

  • Si la colonne en sortie est de type json ou jsonb, la valeur JSON est reproduite exactement.

  • Si la colonne en sortie est un type (de ligne) composite, et que la valeur JSON est un objet JSON, les champs de l'objet sont convertis en colonnes du type de ligne par application rĂ©cursive de ces rĂšgles.

  • De la mĂȘme façon, si la colonne en sortie est un type tableau et que la valeur JSON est un tableau JSON, les Ă©lĂ©ments du tableau JSON sont convertis en Ă©lĂ©ments du tableau en sortie par application rĂ©cursive de ces rĂšgles.

  • Sinon, si la valeur JSON est une chaĂźne, le contenu de la chaĂźne est donnĂ© Ă  la fonction de conversion en entrĂ©e pour le type de donnĂ©es de la colonne.

  • Sinon, la reprĂ©sentation textuelle habituelle de la valeur JSON est envoyĂ©e Ă  la fonction de conversion en entrĂ©e pour le type de donnĂ©es de la colonne.

Bien que l'exemple ci-dessous utilise une valeur constante JSON, une utilisation typique serait de rĂ©fĂ©rencer une colonne json ou jsonb latĂ©ralement d'une autre table dans la clause FROM de la requĂȘte. Écrire json_populate_record dans la clause FROM est une bonne pratique, car toutes les colonnes extraites sont utilisables sans avoir Ă  faire des appels dupliquĂ©s Ă  la fonction.

create type subrowtype as (d int, e text); create type myrowtype as (a int, b text[], c subrowtype);

select * from json_populate_record(null::myrowtype, '{"a": 1, "b": ["2", "a b"], "c": {"d": 4, "e": "a b c"}, "x": "foo"}') →

 a |   b       |      c
---+-----------+-------------
 1 | {2,"a b"} | (4,"a b c")
       

json_populate_recordset ( base anyelement, from_json json ) → setof anyelement

jsonb_populate_recordset ( base anyelement, from_json jsonb ) → setof anyelement

Étend le tableau JSON de haut niveau composĂ© d'objets en un ensemble de lignes ayant le type composite de l'argument base. Chaque Ă©lĂ©ment du tableau JSON est traitĂ© comme dĂ©crit ci-dessus pour json[b]_populate_record.

create type twoints as (a int, b int);

select * from json_populate_recordset(null::twoints, '[{"a":1,"b":2}, {"a":3,"b":4}]') →

 a | b
---+---
 1 | 2
 3 | 4
       

json_to_record ( json ) → record

jsonb_to_record ( jsonb ) → record

Étend l'objet JSON de haut niveau en une ligne ayant le type composite dĂ©fini par une clause AS. (Comme avec toutes les fonctions renvoyant record, la requĂȘte appelante doit explicitement dĂ©finir la structure de l'enregistrement avec une clause AS.) L'enregistrement en sortie est rempli avec les champs de l'objet JSON, de la mĂȘme façon que dĂ©crite ci-dessus pour json[b]_populate_record. Comme il n'existe aucune valeur record en entrĂ©e, les colonnes sans correspondance sont remplies avec des NULL.

create type myrowtype as (a int, b text);

select * from json_to_record('{"a":1, "b":[1,2,3], "c":[1,2,3], "e":"bar", "r": {"a": 123, "b": "a b c"}}') as x(a int, b text, c int[], d text, r myrowtype) →

 a |    b    |    c    | d |       r
---+---------+---------+---+---------------
 1 | [1,2,3] | {1,2,3} |   | (123,"a b c")
       

json_to_recordset ( json ) → setof record

jsonb_to_recordset ( jsonb ) → setof record

Étend le tableau JSON de haut niveau composĂ© d'objets en un ensemble de lignes ayant le type composite dĂ©fini par une clause AS. (Comme avec toutes les fonctions renvoyant record, la requĂȘte appelante doit explicitement dĂ©finir la structure de l'enregistrement avec une clause AS.) Chaque Ă©lĂ©ment du tableau JSON est traitĂ© comme dĂ©crit ci-dessus pour json[b]_populate_record.

select * from json_to_recordset('[{"a":1,"b":"foo"}, {"a":"2","c":"bar"}]') as x(a int, b text) →

 a |  b
---+-----
 1 | foo
 2 |
       

jsonb_set ( target jsonb, path text[], new_value jsonb [, create_if_missing boolean ] ) → jsonb

Renvoie target avec l'élément désigné par path remplacé par new_value ou avec new_value ajouté si create_if_missing vaut true (ce qui est la valeur par défaut) et si l'élément désigné par path n'existe pas. Toutes les étapes précédentes dans le chemin doivent exister, sinon le target est renvoyé intact. Comme avec les opérateurs orientés chemin, les entiers négatifs qui apparaissent dans path se décomptent à partir de la fin des tableaux JSON. Si l'étape du dernier chemin est un index inexistant (hors limite) du tableau et si create_if_missing vaut true, la nouvelle valeur est ajoutée au début du tableau si l'index est négatif et à la fin du tableau s'il est positif.

jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0,f1}','[2,3,4]', false) → [{"f1": [2, 3, 4], "f2": null}, 2, null, 3]

jsonb_set('[{"f1":1,"f2":null},2]', '{0,f3}', '[2,3,4]') → [{"f1": 1, "f2": null, "f3": [2, 3, 4]}, 2]

jsonb_set_lax ( target jsonb, path text[], new_value jsonb [, create_if_missing boolean [, null_value_treatment text ]] ) → jsonb

Si new_value n'est pas NULL, se comporte de façon identique Ă  jsonb_set. Sinon se comporte suivant la valeur de null_value_treatment qui doit ĂȘtre parmi 'raise_exception', 'use_json_null', 'delete_key' ou 'return_target'. Par dĂ©faut, il s'agit de 'use_json_null'.

jsonb_set_lax('[{"f1":1,"f2":null},2,null,3]', '{0,f1}', null) → [{"f1": null, "f2": null}, 2, null, 3]

jsonb_set_lax('[{"f1":99,"f2":null},2]', '{0,f3}', null, true, 'return_target') → [{"f1": 99, "f2": null}, 2]

jsonb_insert ( target jsonb, path text[], new_value jsonb [, insert_after boolean ] ) → jsonb

Renvoie target avec new_value inséré. Si l'élément désigné par path est un élément de tableau, new_value sera inséré avant cet élément si insert_after vaut false (ce qui est la valeur par défaut) ou aprÚs si insert_after vaut true. Si l'élément désigné par path est un champ objet, new_value sera inséré seulement si l'objet ne contient pas déjà cette clé. Toutes les étapes précédentes dans le chemin doivent exister, sinon target est renvoyé non modifié. Comme avec les opérateurs orientés chemin, les nombres négatifs qui apparaissent dans path sont décomptés à partir de la fin des tableaux JSON. Si la derniÚre étape du chemin est un index hors limite de tableau, la nouvelle valeur est ajoutée au début du tableau si l'index est négatif ou à la fin du tableau s'il est positif.

jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"') → {"a": [0, "new_value", 1, 2]}

jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"', true) → {"a": [0, 1, "new_value", 2]}

json_strip_nulls ( json ) → json

jsonb_strip_nulls ( jsonb ) → jsonb

Supprime tous les champs objets ayant des valeurs NULL à partir de la valeur JSON donnée, de façon récurvise. Les valeurs NULL qui ne sont pas des champs objets ne sont pas touchées.

json_strip_nulls('[{"f1":1, "f2":null}, 2, null, 3]') → [{"f1":1},2,null,3]

jsonb_path_exists ( target jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → boolean

VĂ©rifie si le chemin JSON renvoie des Ă©lĂ©ments de la valeur JSON spĂ©cifiĂ©e. Si l'argument vars est indiquĂ©, il doit correspondre Ă  un objet JSON, et ses champs fournissent des valeurs nommĂ©es Ă  substituer dans l'expression jsonpath. Si l'argument silent est indiquĂ© et vaut true, la fonction supprime les mĂȘmes erreurs que les opĂ©rateurs @? et @@.

jsonb_path_exists('{"a":[1,2,3,4,5]}', '$.a[*] ? (@ >= $min && @ <= $max)', '{"min":2,"max":4}') → t

jsonb_path_match ( target jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → boolean

Renvoie le rĂ©sultat de la vĂ©rification d'un prĂ©dicat de chemin JSON pour la valeur JSON spĂ©cifiĂ©e. Seul le premier Ă©lĂ©ment du rĂ©sultat est pris en compte. Si le rĂ©sultat n'est pas un boolĂ©en, alors NULL est renvoyĂ©. Les arguments optionnels vars et silent agissent de la mĂȘme façon que pour jsonb_path_exists.

jsonb_path_match('{"a":[1,2,3,4,5]}', 'exists($.a[*] ? (@ >= $min && @ <= $max))', '{"min":2,"max":4}') → t

jsonb_path_query ( target jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → setof jsonb

Renvoie tous les Ă©lĂ©ments JSON renvoyĂ©s par le chemin JSON pour la valeur JSON spĂ©cifiĂ©e. Les arguments optionnels vars et silent agissent de la mĂȘme façon que pour jsonb_path_exists.

select * from jsonb_path_query('{"a":[1,2,3,4,5]}', '$.a[*] ? (@ >= $min && @ <= $max)', '{"min":2,"max":4}') →

 jsonb_path_query
------------------
 2
 3
 4
       

jsonb_path_query_array ( target jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → jsonb

Renvoie tous les Ă©lĂ©ments JSON renvoyĂ©s par le chemin JSON pour la valeur JSON spĂ©cifiĂ©e, sous la forme d'un tableau JSON. Les arguments optionnels vars et silent agissent de la mĂȘme façon que pour jsonb_path_exists.

jsonb_path_query_array('{"a":[1,2,3,4,5]}', '$.a[*] ? (@ >= $min && @ <= $max)', '{"min":2, "max":4}') → [2, 3, 4]

jsonb_path_query_first ( target jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → jsonb

Renvoie le premier Ă©lĂ©ment JSON renvoyĂ© par le chemin JSON pour la valeur JSON spĂ©cifiĂ©e. Renvoie NULL s'il n'y a pas de rĂ©sultat. Les arguments optionnels vars et silent agissent de la mĂȘme façon que pour jsonb_path_exists.

jsonb_path_query_first('{"a":[1,2,3,4,5]}', '$.a[*] ? (@ >= $min && @ <= $max)', '{"min":2, "max":4}') → 2

jsonb_path_exists_tz ( target jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → boolean

jsonb_path_match_tz ( target jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → boolean

jsonb_path_query_tz ( target jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → setof jsonb

jsonb_path_query_array_tz ( target jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → jsonb

jsonb_path_query_first_tz ( target jsonb, path jsonpath [, vars jsonb [, silent boolean ]] ) → jsonb

Ces fonctions agissent comme leurs homologues dĂ©crits ci-dessus sans le suffixe _tz, sauf que ces fonctions acceptent la comparaison de valeurs date/heure qui nĂ©cessitent des conversions adaptĂ©es suivant le fuseau horaire. L'exemple ci-dessous requiert l'interprĂ©tation de la valeur date seule 2015-08-02 comme un horodatage avec fuseau horaire, pour que le rĂ©sultat dĂ©pende du paramĂ©trage actuel de TimeZone. Du fait de cette dĂ©pendance, ces fonctions sont marquĂ©es stables, ce qui signifie que ces fonctions ne peuvent pas ĂȘtre utilisĂ©es dans les index. Leurs homologues sont immuables, et donc peuvent ĂȘtre utilisĂ©s dans les index ; cependant, elles renverront des erreurs si on leur demande ce type de comparaison.

jsonb_path_exists_tz('["2015-08-01 12:00:00-05"]', '$[*] ? (@.datetime() < "2015-08-02".datetime())') → t

jsonb_pretty ( jsonb ) → text

Convertit la valeur JSON donnée en un texte proprement indenté.

jsonb_pretty('[{"f1":1, "f2":null}, 2]') →

[
    {
        "f1": 1,
        "f2": null
    },
    2
]
       

json_typeof ( json ) → text

jsonb_typeof ( jsonb ) → text

Renvoie le type de la valeur JSON de haut niveau sous la forme d'une chaĂźne de caractĂšres. Les types possibles sont object, array, string, number, boolean et null. (Le rĂ©sultat null ne doit pas ĂȘtre pris pour un NULL SQL ; voir les exemples.)

json_typeof('-123.4') → number

json_typeof('null'::json) → null

json_typeof(NULL::json) IS NULL → t


9.16.2. Le langage de chemin SQL/JSON

Les expressions de chemin SQL/JSON indiquent les Ă©lĂ©ments Ă  rĂ©cupĂ©rer Ă  partir de donnĂ©es JSON, similaires aux expressions XPath utilisĂ©es pour l'accĂšs SQL au XML. Dans PostgreSQL, les expressions de chemin sont implĂ©mentĂ©es sous la forme du type de donnĂ©es jsonpath et peuvent utiliser tout Ă©lĂ©ment dĂ©crit dans Section 8.14.7.

Les fonctions et opĂ©rateurs de requĂȘtes JSON passent l'expression de chemin fournie au moteur de chemin pour Ă©valuation. Si l'expression correspond Ă  la donnĂ©e JSON requĂȘtĂ©e, l'Ă©lĂ©ment JSON correspondant ou l'ensemble d'Ă©lĂ©ments est renvoyĂ©. Les expressions de chemin sont Ă©crites dans le langage de chemin SQL/JSON et peuvent inclure les expressions et fonctions arithmĂ©tiques.

Une expression de chemin consiste en une sĂ©quence d'Ă©lĂ©ments autorisĂ©s par le type de donnĂ©es jsonpath. L'expression de chemin est habituellement Ă©valuĂ©e de gauche Ă  droite, mais vous pouvez utiliser les parenthĂšses pour modifier l'ordre des opĂ©rations. Si l'Ă©valuation rĂ©ussit, une sĂ©quence d'Ă©lĂ©ments JSON est produite et le rĂ©sultat de l'Ă©valuation est renvoyĂ© Ă  la fonction de requĂȘte JSON qui termine le traitement indiquĂ©.

Pour faire rĂ©fĂ©rence Ă  la valeur JSON en cours de requĂȘtage (l'Ă©lĂ©ment de contexte), utilisez la variable $ dans l'expression de chemin. Elle peut ĂȘtre suivie par un ou plusieurs opĂ©rateurs d'accesseurs, qui descendent dans la structure JSON, Ă©tape par Ă©tape, pour rĂ©cupĂ©rer les sous-Ă©lĂ©ments de l'Ă©lĂ©ment de contexte. Chaque opĂ©rateur qui suit traite le rĂ©sultat de l'Ă©tape d'Ă©valuation prĂ©cĂ©dente.

Par exemple, supposez que vous ayez certaines donnĂ©es JSON Ă  partir d'un traqueur GPS que vous voulez analyser, tel que :

{
  "track": {
    "segments": [
      {
        "location":   [ 47.763, 13.4034 ],
        "start time": "2018-10-14 10:05:14",
        "HR": 73
      },
      {
        "location":   [ 47.706, 13.2635 ],
        "start time": "2018-10-14 10:39:21",
        "HR": 135
      }
    ]
  }
}
  

Pour rĂ©cupĂ©rer les segments de piste disponibles, vous avez besoin d'utiliser l'opĂ©rateur d'accesseur .key pour descendre Ă  travers les objets JSON tout autour :

$.track.segments
  

Pour rĂ©cupĂ©rer le contenu d'un tableau, vous utilisez typiquement l'opĂ©rateur [*]. Par exemple, le chemin suivant renverra les coordonnĂ©es d'emplacement pour tous les segments de piste disponibles :

$.track.segments[*].location
  

Pour renvoyer les coordonnĂ©es du premier segment seulement, vous pouvez indiquer l'indice correspondant dans l'opĂ©rateur []. Rappellez-vous que les indices de tableau JSON commencent Ă  0 :

$.track.segments[0].location
  

Le rĂ©sultat de chaque Ă©tape d'Ă©valuation de chemin peut ĂȘtre traitĂ© par un ou plusieurs opĂ©rateurs et mĂ©thodes jsonpath, listĂ©s dans Section 9.16.2.2. Chaque nom de mĂ©thode doit ĂȘtre prĂ©cĂ©dĂ© d'un point. Par exemple, vous pouvez obtenir la taille d'un tableau :

$.track.segments.size()
  

D'autres exemples d'utilisation d'opĂ©rateurs et mĂ©thodes jsonpath Ă  l'intĂ©rieur d'expressions de chemins apparaissent ci-dessous dans Section 9.16.2.2.

Lors de la dĂ©finition d'un chemin, vous pouvez aussi utiliser une ou plusieurs expressions de filtre qui fonctionnent de façon similaire Ă  la clause WHERE en SQL. Une expression de filtre commence avec un point d'interrogation et fournit une condition entre parenthĂšses :

? (condition)
  

Les expressions de filtre doivent ĂȘtre Ă©crites juste aprĂšs l'Ă©tape d'Ă©valuation du chemin auquel elles s'appliquent. Le rĂ©sultat de cette Ă©tape est filtrĂ© pour inclure seulement les Ă©lĂ©ments qui satisfont la condition fournie. SQL/JSON dĂ©finit une logique Ă  trois valeurs, donc la condition peut valoir true, false ou unknown. La valeur unknown joue le mĂȘme rĂŽle que le NULL SQL et peut ĂȘtre testĂ©e avec le prĂ©dicat is unknown. Les Ă©tapes suivantes d'Ă©valuation du chemin utilisent seulement les Ă©lĂ©ments pour lesquels l'expression de filtre renvoie true.

Les fonctions et opĂ©rateurs pouvant ĂȘtre utilisĂ©s dans des expressions de filtre sont listĂ©s dans Tableau 9.50. À l'intĂ©rieur d'une expression de filtre, la variable @ dĂ©note la valeur en cours de filtrage (un rĂ©sultat de l'Ă©tape de chemin prĂ©cĂ©dente). Vous pouvez Ă©crire les opĂ©rateurs d'accesseurs aprĂšs @ pour rĂ©cupĂ©rer les Ă©lĂ©ments du composant.

Par exemple, supposez que vous vouliez rĂ©cupĂ©rer toutes les valeurs de frĂ©quence cardiaque supĂ©rieures Ă  130. Vous pouvez le faire en utilisant l'expression suivante :

$.track.segments[*].HR ? (@ > 130)
  

Pour obtenir les heures de dĂ©but des segments ayant une telle valeur, vous devez filtrer les segments incompatiables avant de renvoyer les heures de dĂ©but, donc l'expression de filtre est appliquĂ©e Ă  l'Ă©tape prĂ©cĂ©dente, et le chemin utilisĂ© dans la condition est diffĂ©rent :

$.track.segments[*] ? (@.HR > 130)."start time"
  

Vous pouvez utiliser plusieurs expressions de filtre en sĂ©quence, si nĂ©cessaire. Par exemple, l'expression suivante sĂ©lectionne les heures de dĂ©but de tous les segments qui contiennent des emplacements avec les bonnes coordonnĂ©es et les valeurs hautes de frĂ©quence cardiaque :

$.track.segments[*] ? (@.location[1] < 13.4) ? (@.HR > 130)."start time"
  

Il est aussi autorisĂ© d'utiliser des expressions de filtre Ă  diffĂ©rents niveaux de profondeur. L'exemple suivant filtre tout d'abord tous les segments par emplacement, puis renvoie les valeurs hautes de frĂ©quence cardiaque sur ces segments, si disponibles :

$.track.segments[*] ? (@.location[1] < 13.4).HR ? (@ > 130)
  

Vous pouvez aussi imbriquer les expressions de filtre :

$.track ? (exists(@.segments[*] ? (@.HR > 130))).segments.size()
  

Cette expression renvoie la taille de la trace si elle contient des segments avec des valeurs hautes de fréquence cardiaque ou, sinon, une séquence vide.

L'implĂ©mentation PostgreSQL du langage de chemin SQL/JSON prĂ©sente les diffĂ©rences suivantes sur le standard SQL/JSON :

  • Une expression de chemin peut ĂȘtre un prĂ©dicat boolĂ©en, bien que le standard SQL/JSON autorise les prĂ©dicats uniquement dans les filtres. Ceci est nĂ©cessaire pour l'implĂ©mentation de l'opĂ©rateur @@. Par exemple, l'expression jsonpath suivante est valide dans PostgreSQL :

    $.track.segments[*].HR < 70
        

  • Il existe des diffĂ©rences mineures dans l'interprĂ©tation des motifs d'expression rationnelle utilisĂ©s dans les filtres like_regex, comme dĂ©crit dans Section 9.16.2.3.

9.16.2.1. Modes strict et permissif

Quand vous requĂȘtez des donnĂ©es JSON, l'expression de chemin pourrait ne pas correspondre Ă  la structure de donnĂ©es JSON actuelle. Une tentative d'accĂ©der Ă  un membre inexistant d'un objet ou d'un Ă©lĂ©ment d'un tableau rĂ©sulterait en une erreur de structure. Les expressions de chemin SQL/JSON ont deux modes pour la gestion des erreurs de structure :

  • lax (permissif, par dĂ©faut) -- le moteur de chemin adapte implicitement la donnĂ©e requĂȘtĂ©e au chemin spĂ©cifiĂ©. Toute erreur de structure restante est supprimĂ©e et convertie en des sĂ©quences SQL/JSON vides.

  • strict -- si une erreur de structure survient, une erreur est levĂ©e.

Le mode permissif facilite la correspondance de la structure d'un document JSON et celle d'une expression de chemin si la donnĂ©e JSON n'est pas conforme au schĂ©ma attendu. Si un opĂ©rande ne correspond pas aux demandes d'une opĂ©ration particuliĂšre, il peut ĂȘtre automatiquement intĂ©grĂ© Ă  un tableau SQL/JSON ou dĂ©ballĂ© en convertissant ses Ă©lĂ©ments en une sĂ©quence SQL/JSON avant de rĂ©aliser cette opĂ©ration. De plus, les opĂ©rateurs de comparaison dĂ©ballent automatiquement leurs opĂ©randes dans le mode permissif, donc vous pouvez directement comparer les tableaux SQL/JSON. Un tableau de taille 1 est considĂ©rĂ© Ă©gal Ă  son seul Ă©lĂ©ment. Le dĂ©ballage automatique n'est pas rĂ©aliser si :

  • L'expression de chemin contient les mĂ©thodes type() ou size() qui renvoient respectivement le type et le nombre d'Ă©lĂ©ments dans le tableau.

  • Les donnĂ©es JSON requĂȘtĂ©es contiennent des tableaux imbriquĂ©s. Dans ce cas, seul le tableau externe est dĂ©ballĂ© alors que les tableaux internes restent inchangĂ©s. De ce fait, le dĂ©ballage implicite peut seulement descendre d'un niveau Ă  chaque Ă©tape d'Ă©valuation du chemin.

Par exemple, lors du requĂȘtage de donnĂ©es GPS ci-dessus, vous pouvez faire abstraction du fait qu'il stocke un tableau de segments en utilisant le mode permissif :

lax $.track.segments.location
   

Dans le mode strict, le chemin spĂ©cifiĂ© doit correspondre exactement Ă  la structure du document JSON requĂȘtĂ© pour renvoyer un Ă©lĂ©ment SQL/JSON, donc utiliser cette expression de chemin causera une erreur. Pour obtenir le mĂȘme rĂ©sultat que dans le mode permissif, vous devez explicitement dĂ©baller le tableau segments :

strict $.track.segments[*].location
   

L'accesseur .** peut apporter des rĂ©sultats surprenants lors de l'utilisation du mode non strict. Par exemple, la requĂȘte suivante sĂ©lectionne chaque valeur HR deux fois :

lax $.**.HR

Ceci survient parce que l'accesseur .** sĂ©lectionne Ă  la fois le tableau de segments et chacun de ses Ă©lĂ©ments, alors que l'accesseur .HR dĂ©balle automatiquement les tableaux lors de l'utilisation du mode non strict. Pour Ă©viter des rĂ©sultats surprenants, nous recommandons d'utiliser l'accesseur .** uniquement dans le mode strict. la requĂȘte suivant sĂ©lectionne chaque valeur HR une seule fois :

strict $.**.HR

9.16.2.2. OpĂ©rateurs et mĂ©thodes de chemin SQL/JSON

Tableau 9.49 montre les opĂ©rateurs et mĂ©thodes disponibles pour jsonpath. Notez que, bien que les opĂ©rateurs et mĂ©thodes unaires puissent ĂȘtre appliquĂ©s Ă  de nombreuses valeurs rĂ©sultant d'une Ă©tape de chemin prĂ©cĂ©dente, les opĂ©rateurs binaires (addition etc.) peuvent seulement ĂȘtre appliquĂ©s Ă  des valeurs seules.

Tableau 9.49. OpĂ©rateurs et mĂ©thodes jsonpath

Opérateur/Méthode

Description

Exemple(s)

number + number → number

Addition

jsonb_path_query('[2]', '$[0] + 3') → 5

+ number → number

Plus unaire (pas d'opĂ©ration) ; contrairement Ă  l'addition, ceci peut itĂ©rer sur plusieurs valeurs

jsonb_path_query_array('{"x": [2,3,4]}', '+ $.x') → [2, 3, 4]

number - number → number

Soustraction

jsonb_path_query('[2]', '7 - $[0]') → 5

- number → number

NĂ©gation ; contrairement Ă  la soustraction, ceci peut itĂ©rer sur plusieurs valeurs

jsonb_path_query_array('{"x": [2,3,4]}', '- $.x') → [-2, -3, -4]

number * number → number

Multiplication

jsonb_path_query('[4]', '2 * $[0]') → 8

number / number → number

Division

jsonb_path_query('[8.5]', '$[0] / 2') → 4.2500000000000000

number % number → number

Modulo (reste)

jsonb_path_query('[32]', '$[0] % 10') → 2

value . type() → string

Type de l'élément JSON (voir json_typeof)

jsonb_path_query_array('[1, "2", {}]', '$[*].type()') → ["number", "string", "object"]

value . size() → number

Taille de l'élément JSON (nombre d'éléments d'un tableau, ou 1 si ce n'est pas un tableau)

jsonb_path_query('{"m": [11, 15]}', '$.m.size()') → 2

value . double() → number

Nombre flottant approximatif converti en nombre JSON ou en chaĂźne

jsonb_path_query('{"len": "1.9"}', '$.len.double() * 2') → 3.8

number . ceiling() → number

Entier le plus proche, plus grand ou égal au nombre donné

jsonb_path_query('{"h": 1.3}', '$.h.ceiling()') → 2

number . floor() → number

Entier le plus proche, plus petit ou égal au nombre donné

jsonb_path_query('{"h": 1.7}', '$.h.floor()') → 1

number . abs() → number

Valeur absolue du nombre donné

jsonb_path_query('{"z": -0.3}', '$.z.abs()') → 0.3

string . datetime() → datetime_type (voir note)

Valeur date/heure convertie en chaĂźne

jsonb_path_query('["2015-8-1", "2015-08-12"]', '$[*] ? (@.datetime() < "2015-08-2".datetime())') → "2015-8-1"

string . datetime(template) → datetime_type (voir note)

Valeur date/heure convertie en une chaßne en utilisant le modÚle to_timestamp indiqué

jsonb_path_query_array('["12:30", "18:40"]', '$[*].datetime("HH24:MI")') → ["12:30:00", "18:40:00"]

object . keyvalue() → array

Les paires clĂ©-valeur de l'objet, reprĂ©sentĂ©es sous la forme d'un tableau d'objets contenant trois champs : "key", "value" et "id" ; "id" est un identifiant unique de l'objet auquel la paire clĂ©-valeur appartient

jsonb_path_query_array('{"x": "20", "y": 32}', '$.keyvalue()') → [{"id": 0, "key": "x", "value": "20"}, {"id": 0, "key": "y", "value": 32}]


Note

Le type de rĂ©sultat des mĂ©thodes datetime() et datetime(template) peut ĂȘtre date, timetz, time, timestamptz ou timestamp. Les deux mĂ©thodes dĂ©terminent dynamiquement le type du rĂ©sultat.

La mĂ©thode datetime() trie en sĂ©quence pour faire correspondre sa chaĂźne en entrĂ©e aux formats ISO pour les types date, timetz, time, timestamptz et timestamp. Elle s'arrĂȘte au premier format correspondant et Ă©met le type de donnĂ©es correspondant.

La méthode datetime(template) détermine le type de résultat suivant les champs utilisés dans la chaßne modÚle fournie.

Les mĂ©thodes datetime() et datetime(template) utilisent les mĂȘmes rĂšgles d'analyse que la fonction SQL to_timestamp (voir Section 9.8), avec trois exceptions. Tout d'abord, ces mĂ©thodes n'autorisent pas les motifs de modĂšle sans correspondance. Ensuite, seuls les sĂ©parateurs suivants sont autorisĂ©s dans la chaĂźne modĂšle : signe moins, point, barre oblique, virgule, apostrophe, point-virgule, deux-points et espace. Enfin, les sĂ©parateurs dans la chaĂźne modĂšle doivent correspondre exactement Ă  la chaĂźne en entrĂ©e.

Si diffĂ©rents types date/heure doivent ĂȘtre comparĂ©s, une conversion implicite est appliquĂ©e. Une valeur date peut ĂȘtre convertie en timestamp ou timestamptz, une valeur timestamp peut ĂȘtre convertie en timestamptz, et une valeur time en timetz. NĂ©anmoins, toutes sauf la premiĂšre de ces conversions dĂ©pendent du paramĂ©trage actuel de TimeZone, et de ce fait peuvent seulement ĂȘtre rĂ©alisĂ©es Ă  travers les fonctions jsonpath sensibles au fuseau horaire.

Tableau 9.50 montre les Ă©lĂ©ments d'expression de filtre disponibles.

Tableau 9.50. Ă‰lĂ©ments d'expression de filtre jsonpath

Prédicat/valeur

Description

Exemple(s)

value == value → boolean

Comparaison d'égalité (ceci, et les autres opérateurs de comparaison, fonctionnent sur toutes les valeurs scalaires JSON)

jsonb_path_query_array('[1, "a", 1, 3]', '$[*] ? (@ == 1)') → [1, 1]

jsonb_path_query_array('[1, "a", 1, 3]', '$[*] ? (@ == "a")') → ["a"]

value != value → boolean

value <> value → boolean

Comparaison de non égalité

jsonb_path_query_array('[1, 2, 1, 3]', '$[*] ? (@ != 1)') → [2, 3]

jsonb_path_query_array('["a", "b", "c"]', '$[*] ? (@ <> "b")') → ["a", "c"]

value < value → boolean

Comparaison inférieur

jsonb_path_query_array('[1, 2, 3]', '$[*] ? (@ < 2)') → [1]

value <= value → boolean

Comparaison inférieur ou égal

jsonb_path_query_array('["a", "b", "c"]', '$[*] ? (@ <= "b")') → ["a", "b"]

value > value → boolean

Comparaison supérieur

jsonb_path_query_array('[1, 2, 3]', '$[*] ? (@ > 2)') → [3]

value >= value → boolean

Comparaison supérieur ou égal

jsonb_path_query_array('[1, 2, 3]', '$[*] ? (@ >= 2)') → [2, 3]

true → boolean

Constante JSON true

jsonb_path_query('[{"name": "John", "parent": false}, {"name": "Chris", "parent": true}]', '$[*] ? (@.parent == true)') → {"name": "Chris", "parent": true}

false → boolean

Constante JSON false

jsonb_path_query('[{"name": "John", "parent": false}, {"name": "Chris", "parent": true}]', '$[*] ? (@.parent == false)') → {"name": "John", "parent": false}

null → value

Constante JSON null (notez que, contrairement au SQL, la comparaison avec null fonctionne normalement)

jsonb_path_query('[{"name": "Mary", "job": null}, {"name": "Michael", "job": "driver"}]', '$[*] ? (@.job == null) .name') → "Mary"

boolean && boolean → boolean

AND booléen

jsonb_path_query('[1, 3, 7]', '$[*] ? (@ > 1 && @ < 5)') → 3

boolean || boolean → boolean

OR booléen

jsonb_path_query('[1, 3, 7]', '$[*] ? (@ < 1 || @ > 5)') → 7

! boolean → boolean

NOT booléen

jsonb_path_query('[1, 3, 7]', '$[*] ? (!(@ < 5))') → 7

boolean is unknown → boolean

Teste si une condition booléenne est unknown.

jsonb_path_query('[-1, 2, 7, "foo"]', '$[*] ? ((@ > 0) is unknown)') → "foo"

string like_regex string [ flag string ] → boolean

Teste si le premier opĂ©rande correspond Ă  l'expression rationnelle donnĂ©e par le deuxiĂšme opĂ©rande, optionnellement avec les modifications dĂ©crites par une chaĂźne avec les caractĂšres de flag (voir Section 9.16.2.3).

jsonb_path_query_array('["abc", "abd", "aBdC", "abdacb", "babc"]', '$[*] ? (@ like_regex "^ab.*c")') → ["abc", "abdacb"]

jsonb_path_query_array('["abc", "abd", "aBdC", "abdacb", "babc"]', '$[*] ? (@ like_regex "^ab.*c" flag "i")') → ["abc", "aBdC", "abdacb"]

string starts with string → boolean

Teste si le deuxiÚme opérande est une sous-chaßne initiale du premier opérande.

jsonb_path_query('["John Smith", "Mary Stone", "Bob Johnson"]', '$[*] ? (@ starts with "John")') → "John Smith"

exists ( path_expression ) → boolean

Teste si une expression de chemin correspond Ă  au moins un Ă©lĂ©ment SQL/JSON. Renvoie unknown si l'expression de chemin retourne une erreur ; le deuxiĂšme exemple utilise ceci pour Ă©viter une erreur de clĂ© inexistante dans le mode strict.

jsonb_path_query('{"x": [1, 2], "y": [2, 4]}', 'strict $.* ? (exists (@ ? (@[*] > 2)))') → [2, 4]

jsonb_path_query_array('{"value": 41}', 'strict $ ? (exists (@.name)) .name') → []


9.16.2.3. Expressions rationnelles SQL/JSON

Les expressions de chemin SQL/JSON permettent la correspondance de texte selon une expression rationnelle avec le filtre like_regex. Par exemple, la requĂȘte de chemin SQL/JSON suivante correspondrait, sans sensibilitĂ© Ă  la casse, Ă  toutes les chaĂźnes d'un tableau commençant avec une voyelle anglaise :

$[*] ? (@ like_regex "^[aeiou]" flag "i")
   

La chaĂźne optionnelle flag pourrait inclure un ou plusieurs caractĂšres : i pour une recherche insensible Ă  la casse, m pour autoriser ^ et $ Ă  correspondre aux nouvelles lignes, s pour autoriser . Ă  correspondre Ă  une nouvelle ligne, et q pour englober le motif complet (rĂ©duisant le comportement Ă  une simple correspondance de sous-chaĂźne).

Le standard SQL/JSON emprunte sa dĂ©finition d'expressions rationnelles de l'opĂ©rateur LIKE_REGEX qui, Ă  son tour, utilise le standard XQuery. PostgreSQL n'accepte pas actuellement l'opĂ©rateur LIKE_REGEX. De ce fait, le filtre like_regex est implĂ©mentĂ© en utilisant le moteur d'expression rationnelle POSIX dĂ©crit dans Section 9.7.3. Ceci amĂšne diffĂ©rentes variations mineures du comportement du standard SQL/JSON, listĂ©es dans Section 9.7.3.8. Notez, nĂ©anmoins, que les incompatibilitĂ©s au niveau des lettres du drapeau dĂ©crites ici ne s'appliquent pas Ă  SQL/JSON, car elles traduisent les lettres drapeau de XQuery pour correspondre Ă  ce que le moteur POSIX attend.

Gardez en tĂȘte que l'argument motif de like_regex est une chaĂźne littĂ©rale de chemin JSON, Ă©crite suivant les rĂšgles donnĂ©es dans Section 8.14.7. Ceci signifie en particulier que tout antislash utilisĂ© dans l'expression rationnelle doit ĂȘtre doublĂ©. Par exemple, pour Ă©tablir une correspondance aux valeurs de type chaĂźne de caractĂšres du document racine ne contenant que des chiffres :

$.* ? (@ like_regex "^\\d+$")