【问题标题】:Better/shorter way to check inexistence of JSONB key检查 JSONB 密钥不存在的更好/更短的方法
【发布时间】:2015-01-22 06:16:22
【问题描述】:

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

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)

【问题讨论】:

    标签: postgresql jsonb


    【解决方案1】:

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

    where data_jsonb ? 'key'
    

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 正确,因为IS NULL的绑定强度比->>强。
      猜你喜欢
      • 2016-12-25
      • 1970-01-01
      • 2011-06-13
      • 2022-10-23
      • 2011-05-30
      • 2014-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多