web-dev-qa-db-fra.com

Comment demander des valeurs nulles dans le type de champ json postgresql?

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
36
Alexandru R

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}
52
Roman Pekar

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

6
mraxus

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.

1
Reinsbrain