目標是返回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。 –