我正在尝试使用 JSONB 进行查询,但是我遇到了一个问题,我不知道第一个键可能是什么。
理想情况下,我可以在查询中使用通配符。
例如:下面的作品
WHERE json_data #> '{first_key,second_key}' = '"value-of-second-key"'
但我可能不知道 first_key 的名称或想匹配任何嵌套的子键。 类似的东西。
WHERE json_data #> '{*,second_key}' = '"value-of-second-key"'
最好使用像“*”这样的通配符
如有任何建议或方法,我们将不胜感激。
最佳答案
#>
运算符不能使用通配符,但可以使用 jsonb_each
function to unnest the first level of the JSON :
SELECT *
FROM jsonb_each('{"foo": {"second_key": "xxx"}, "bar": {"other_second_key": "xxx"}, "baz": {"second_key": "yyy"}}') AS e(key, value)
WHERE e.value @> '{"second_key": "xxx"}';
结果:
key | value
-----+-----------------------
foo | {"second_key": "xxx"}
(1 row)
如果你只是想搜索匹配它的行(而不是确切的 json 元素,如上所述)你可以使用 EXISTS
:
SELECT ...
FROM the_table t
WHERE EXISTS(
SELECT 1
FROM jsonb_each(t.the_jsonb_column) AS e(key, value)
WHERE e.value @> '{"second_key": "xxx"}'
)
从逻辑上讲,这种方法工作正常,但要注意它不能像 e.value @> '{"foo": {"second_key": "xxx"}}'
,因此如果性能真的很重要,您可能需要重新考虑您的架构。
关于sql - 当第一个父键未知时,通过嵌套键的遍历查询 Postgres JSONB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39249999/