3

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

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

我在这个查询中遇到了 2 个问题:

1)如果我通过'foo'as$1但失败了"'foo'"and ,它工作正常"'foo'->'bar'"。所以我不知道如何达到深键。我用node-postgres

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

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

4

2 回答 2

9

您可以使用运算符在特定路径(指定为键数组)处提取元素#>

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

所以这些都可以做到:

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

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

于 2016-03-02T15:05:36.770 回答
1
{
    "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?
于 2016-03-02T15:04:04.540 回答