0

Where data is JSONB column, I want to check if the key exists, normally I use:

SELECT id FROM users WHERE length(data->>'fingerprint_id') IS NULL;

Is there any better/shorter way to do this? since other alternative give incorrect result:

> SELECT id FROM users WHERE data->>'fingerprint_id' IS NULL;
ERROR:  operator does not exist: jsonb ->> boolean
LINE 1: SELECT id FROM users WHERE data->>'fingerprint_id' IS NULL;
                                       ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

> SELECT id FROM users WHERE data->>'fingerprint_id' = '';
 id 
----
(0 rows)
4

2 に答える 2

1

Apparently, I just need to enclose the query with () before IS NULL

SELECT id FROM users WHERE (data->>'fingerprint_id') IS NULL;
于 2015-01-22T06:17:27.413 に答える
1

?この目的のために、明示的な演算子 ( ) があります。

where data_jsonb ? 'key'

ただし、これにより、一部の DB 抽象化レイヤー(JDBC など) が?入力パラメーターのプレースホルダーとして誤って認識される可能性があることに注意してください。

回避策として、関数を直接使用するかjsonb_exists(json, text)(ただし、コードは文書化されていない関数に依存します)、この回答のように同様の演算子を定義することができます。

(data ->> 'key') IS NULL構文の詳細については、こちらを参照してください

于 2015-01-22T09:43:08.917 に答える