我有一个简单的查询来检查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?