web-dev-qa-db-ja.com

jsonフィールドタイプpostgresqlでnull値をクエリする方法は?

Postgresqlにjsonタイプのフィールドがあります。ただし、特定のフィールドがnullの行は選択できません。

コード:

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

これは動作するはずですが、このエラーが発生しています:

ERROR:  operator does not exist: json #> boolean
LINE 6: where elem#>'{occupation2}' is null
36
Alexandru R

Json-blob内でnull値を検索している場合、Postgres 9.4で導入された関数json_typeof(json)の使用を検討することができます。

INSERT INTO table
  VALUES ('{ "value": "some", "object": {"int": 1, "nullValue": null}}');

SELECT * FROM table
  WHERE json_typeof(json->'object'->'nullValue') = 'null';

これにより、null値のエントリが見つかります。

お役に立てれば!

リファレンス: http://www.postgresql.org/docs/9.4/static/functions-json.html#FUNCTIONS-JSON-PROCESSING-TABLE

6
mraxus

@ roman-pekarと@mraxusからの回答は役に立ちましたが、未定義とnullを明確に区別する機能がないために満足できませんでした...

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

それは短く、json値が未定義(nullを返す)の場合にもシグナルを提供します。この質問に役立つかもしれません。

1
Reinsbrain