更好/更短的方法来检查 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)
有一个

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

where data_jsonb ? 'key'

但请注意,这可能会导致一些数据库抽象层(f.ex.JDBC) 错误地将?识别为输入参数的占位符。

作为一种解决方法,您可以直接使用 jsonb_exists(json, text) 函数(但您的代码将依赖于未记录的函数),或者为此定义类似的运算符,如本答案所示。

有关(data ->> 'key') IS NULL语法的更多详细信息,请参阅此处。

显然

,我只需要在IS NULL之前用()将查询括起来

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

最新更新