Comment interroger un json colonne pour les objets vides?
À la recherche pour trouver toutes les lignes où un certain json colonne contient un objet vide, {}
. C'est possible avec JSON tableaux, ou si je suis à la recherche d'une clé spécifique dans l'objet. Mais je veux juste savoir si l'objet est vide. N'arrive pas à trouver un opérateur qui va le faire.
dev=# \d test
Table "public.test"
Column | Type | Modifiers
--------+------+-----------
foo | json |
dev=# select * from test;
foo
---------
{"a":1}
{"b":1}
{}
(3 rows)
dev=# select * from test where foo != '{}';
ERROR: operator does not exist: json <> unknown
LINE 1: select * from test where foo != '{}';
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
dev=# select * from test where foo != to_json('{}'::text);
ERROR: operator does not exist: json <> json
LINE 1: select * from test where foo != to_json('{}'::text);
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
dwv=# select * from test where foo != '{}'::json;
ERROR: operator does not exist: json <> json
LINE 1: select * from test where foo != '{}'::json;
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Vous devez vous connecter pour publier un commentaire.
Il est pas de l'égalité (ou l'inégalité) de l'opérateur pour le type de données
json
dans son ensemble, parce que l'égalité est difficile à établir. Envisagerjsonb
dans Postgresql 9.4 ou plus tard, lorsque cela est possible. Plus de détails en ce qui concerne la réponse sur le dba.SE (dernier chapitre):SELECT DISTINCT json_column ...
ou... GROUP BY json_column
échouer pour la même raison (pas d'opérateur d'égalité).Casting des deux côtés de l'expression de
text
permet=
ou<>
opérateurs, mais ce n'est pas normalement fiable qu'il y a de nombreuses représentations du texte pour le mêmejson
valeur.Cependant, pour ce cas particulier (objet vide) il fonctionne très bien:
select * from test where foo->>'property' = '[]';
où la structure peut-être quelque chose comme:{ "property": [], "foo": "bar" }
foo
est une grande structure, chacun est contraint de texte!De PostgreSQL 9.5 ce type de requête avec les données JSON n'est pas possible. En revanche, je suis d'accord qu'il serait très utile et a créé une demande pour elle:
https://postgresql.uservoice.com/forums/21853-general/suggestions/12305481-check-if-json-is-empty
Hésitez pas à voter, et j'espère que cela sera mis en place!
En 9.3 il est possible de compter les paires dans chaque objet et de filtrer ceux avec aucun
ou test de l'existence, probablement plus rapide pour les gros objets
Les deux techniques fonctionnent sans problème quel que soit le formatage de la
s
après la json_each appel dans ces exemples? Quel but a-t-elle?json_each
avecjson_array_elements
Vide tableau JSON
[]
pourrait également être pertinent.Alors que cela pourrait fonctionner pour les deux
[]
et{}
: