目标是返回JSON数据类型中缺少某个键的所有记录。这只是为了明显的,我想查询JSON结构的任何东西,其中faultyField
返回以下表中的数据中null
:postgresql未定义的json字段不会按预期返回null
id::SERIAL | data::JSON
------------+-------------------
1 | {"key" : "val"}
2 | {"key1" : "val2"}
任何以下两个语句:
SELECT * FROM test WHERE data->>'faultyField' = null;
SELECT * FROM test WHERE (data->>'faultyField')::text = 'null';
应该返回所有的价值(根据我在工作中发现的两个SO帖子)?但它不是因为某种原因。这两个只是返回空结果。
我不是使用PostgreSQL的向导,所以我尝试了下面这些语句之间的所有内容,只是为了看看它们是否可以工作。可悲的是,他们没有。
SELECT * FROM test WHERE (SELECT json_object_keys(data) FROM test)='key';
SELECT * FROM test WHERE 'key' in json_object_keys(data);
SELECT * FROM test WHERE 'key' := json_object_keys(data);
SELECT * FROM test WHERE 'key' ANY (json_object_keys(data));
有没有办法返回JSON字符串中缺少密钥的记录?
我想操作系统试图检查一个密钥是否存在,而不是测试它的值。在这种情况下,'data - >>'faultyField'为null'将返回行,即使'faultyField'键存在并且具有空值。但我可能是错的。 –
呃,你错了。 'data - >>'faultyField'为null'当且仅当密钥丢失时才为真。 – klin
你确定吗? 'CREATE TEMP TABLE test AS SELECT 1 AS id,'{“key”:null}':: JSONB AS data; SELECT * FROM test WHERE data - >>'key'IS NULL;'。这个测试用例按我的预期返回该行。测试9.5.6。 –