更好/更短的方法来检查JSONB密钥的不存在

时间:2015-01-22 06:16:23

标签: postgresql jsonb

data是JSONB列,我想检查密钥是否存在,通常我会使用:

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

有更好/更短的方法吗?因为其他替代方案给出了错误的结果:

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

2 个答案:

答案 0 :(得分:1)

显然,我只需要在()之前用IS NULL附上查询

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

答案 1 :(得分:1)

为此目的,有一个显式运算符(?):

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的详细信息。