Better/shorter 检查 JSONB 密钥不存在的方法

Better/shorter way to check inexistence of JSONB key

其中data是JSONB列,我想检查key是否存在,一般我用:

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

有什么better/shorter方法可以做到这一点吗?因为其他选择给出了错误的结果:

> 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)

显然,我只需要在 IS NULL

之前用 () 将查询括起来
SELECT id FROM users WHERE (data->>'fingerprint_id') IS NULL;

有一个用于此目的的显式运算符 (?):

where data_jsonb ? 'key'

但请注意,这可能会导致 some DB abstraction layers(f.ex。JDBC)错误地将 ? 识别为输入参数的占位符。

作为解决方法,您可以直接使用 jsonb_exists(json, text) 函数(但您的代码将依赖于未记录的函数),或为此定义一个类似的运算符,如 this answer.

有关 (data ->> 'key') IS NULL 语法的更多详细信息 can be found here