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

Sql 当第一个父键未知时,通过遍历嵌套键查询Postgres JSONB,sql,json,postgresql,Sql,Json,Postgresql,我试图使用JSONB进行查询,但是我有一个问题,我不知道第一个键可能是什么 理想情况下,我可以在查询中使用通配符 下面的工作 WHERE json_data #> '{first_key,second_key}' = '"value-of-second-key"' 但是我可能不知道第一个_键的名称,或者不想匹配任何嵌套的子键。 差不多 WHERE json_data #> '{*,second_key}' = '"value-of-second-key"' 最好使用像“*”这样的

我试图使用JSONB进行查询,但是我有一个问题,我不知道第一个键可能是什么

理想情况下,我可以在查询中使用通配符

下面的工作

WHERE json_data #> '{first_key,second_key}' = '"value-of-second-key"'
但是我可能不知道第一个_键的名称,或者不想匹配任何嵌套的子键。 差不多

WHERE json_data #> '{*,second_key}' = '"value-of-second-key"'
最好使用像“*”这样的通配符


如果您对此有任何建议或方法,我们将不胜感激。

您不能对
#>
运算符使用通配符,但您可以使用:

结果:

 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”}}
那样利用索引,因此如果性能确实是个问题,您可能需要重新考虑您的模式

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"}'
)