J'ai un champ de type json dans postgresql. Cependant, je ne peux pas sélectionner de lignes où un champ spécifique est nul:
Code:
SELECT *
FROM json_array_elements(
'[{"name": "Toby", "occupation": "Software Engineer"},
{"name": "Zaphod", "occupation": "Galactic President"} ,
{"name2": "Zaphod", "occupation2": null} ]' ) AS elem
where elem#>'{occupation2}' is null
Cela devrait fonctionner mais j'obtiens cette erreur:
ERROR: operator does not exist: json #> boolean
LINE 6: where elem#>'{occupation2}' is null
vous pouvez utiliser le fait que elem->'occupation2'
renvoie une chaîne null
de type json
, donc votre requête sera:
select
*
from json_array_elements(
'[{"name": "Toby", "occupation": "Software Engineer"},
{"name": "Zaphod", "occupation": "Galactic President"} ,
{"name2": "Zaphod", "occupation2": null} ]'
) as elem
where (elem->'occupation2')::text = 'null'
{"name2": "Zaphod", "occupation2": null}
Si vous voulez obtenir tous les éléments dont la valeur est null
en JSON ou la clé n'existe pas, vous pouvez simplement faire:
select
*
from json_array_elements(
'[{"name": "Toby", "occupation": "Software Engineer"},
{"name": "Zaphod", "occupation": "Galactic President"} ,
{"name2": "Zaphod", "occupation2": null} ]'
) as elem
where (elem->>'occupation2') is null
{"name": "Toby", "occupation": "Software Engineer"}
{"name": "Zaphod", "occupation": "Galactic President"}
{"name2": "Zaphod", "occupation2": null}
Si vous recherchez une valeur nulle dans un json-blob, vous pouvez envisager d'utiliser la fonction json_typeof(json)
introduite dans Postgres 9.4:
INSERT INTO table
VALUES ('{ "value": "some", "object": {"int": 1, "nullValue": null}}');
SELECT * FROM table
WHERE json_typeof(json->'object'->'nullValue') = 'null';
Cela vous permettra de trouver votre entrée pour la valeur nulle.
J'espère que cela t'aides!
Référence: http://www.postgresql.org/docs/9.4/static/functions-json.html#FUNCTIONS-JSON-PROCESSING-TABLE
Les réponses de @ roman-pekar et @mraxus ont été utiles mais je n'étais pas satisfait sans la capacité de distinguer clairement indéfini et nul ... alors, j'ai trouvé:
CREATE OR REPLACE FUNCTION isnull (element json)
RETURNS boolean AS $$
SELECT (element IS NOT NULL) AND (element::text = 'null');
$$ LANGUAGE SQL IMMUTABLE STRICT;
select isnull('{"test":null}'::json->'test'); -- returns t
select isnull('{"test":"notnull"}'::json->'test'); -- returns f
select isnull('{"toot":"testundefined"}'::json->'test'); -- returns null
Il est court et me donne également un signal si la valeur json n'est pas définie (renvoie null). C'est peut-être utile pour cette question.