sql - 当第一个父键未知时,通过嵌套键的遍历查询 Postgres JSONB

标签 sql json postgresql

我正在尝试使用 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/

相关文章:

python - Instagram API 文档无效的 JSON 错误

sql - 无法让简单的 PostgreSQL 插入工作

mysql - 从另一个表中选择列并创建一个列

sql - 找不到 postgresql 函数

MySQL根据字段值LEFT JOIN不同的表

java - 为什么只有根记录器在具有 JSON 配置的 Log4j 2 中工作?

jquery - 如何在 ASP.NET MVC 中返回 JSON 格式的 500 错误?

php - 在 PostgreSQL 中使用单引号动态插入文本

sql - 滑动1小时周期聚合查询

php - Mysql 行返回数组中的最后一个值,但我期望整行