检查 PostgreSQL v9.5+ 中的 jsonb 对象深处是否存在密钥



我有一个简单的查询来检查jsonb对象中是否存在密钥

SELECT data->$1 jdata FROM "my-scheme"."my-table"

我用这个查询遇到了 2 个道具:

1)如果我'foo'传递为$1"'foo'""'foo'->'bar'"失败,则工作正常。以至于我不知道如何到达深键。我使用node-postgres

2)我只想检查该键是否存在,而不是通过该键获取所有数据。

所以问题是:如何在不通过该键获取所有数据的情况下检查该键是否存在于 jsonb 对象深处?

您可以使用

#> 运算符提取特定路径(指定为键数组)处的元素。

您还可以通过 ? 运算符检查顶层是否存在键,尽管似乎没有任何接受路径的变体。

因此,其中任何一个都可以做到:

SELECT '{"a":{"b":{"c":1}}}'::jsonb #> '{a,b}' ? 'c'
SELECT '{"a":{"b":{"c":1}}}'::jsonb #> '{a,b,c}' IS NOT NULL

第二个可能更有效一些,因为它避免在将运算符链接在一起时构造中间jsonb值。

{
    "a": {
        "b": 5
    }
}

是有效的 JSON。

{
   'a': {
        'b': 5
    }
}

不是有效的 JSON。指定 json 字符串时使用双引号(键两边),在将其编写为 postgres 标识符时使用单引号。

无论如何:

SELECT distinct true AS found FROM table_name WHERE column_name -> 'foo' ? 'bar';

更多嵌套:

SELECT distinct true AS found FROM jtest WHERE js -> 'a' -> 'c' ? 'd';
如果找到键,将返回 1 条记录,

如果未找到键,将返回 0 条记录。如果您不想指定路径,那么我认为最好的过程是编写一个函数/存储过程来循环遍历所有键。

您要查找的运算符是 ?

摘自: http://www.postgresql.org/docs/9.5/static/functions-json.html

?   text    Does the string exist as a top-level key within the JSON value?

最新更新