我已经写了这样的查询来检查JSON列是否有键:
SELECT *
FROM "details"
where ("data"->'country'->'state'->>'city') is not null;
我们如何编写查询语句,以便在“data”包含“city”的情况下选择行?
数据的JSON结构不一致。
SELECT *
FROM "details"
where ("data"->'country'->'state'->>'city') is not null;
我们如何编写查询语句,以便在“data”包含“city”的情况下选择行?
数据的JSON结构不一致。
?
来检查 data
的 顶级 键。SELECT * FROM details
WHERE data ? 'city';
检查json列中所有嵌套对象中的每个键需要使用递归CTE。
select * from details
where 'city' in (
WITH RECURSIVE t(k,j) as (
select jsonb_object_keys(details.data), details.data
UNION ALL
select jsonb_object_keys(t.j->t.k), t.j->t.k
FROM t WHERE jsonb_typeof(t.j->t.k) = 'object'
)
select k from t
);
当然,这并不是非常高效的。
?
:SELECT *
FROM "details"
WHERE data->'country'->'state' ? 'city';
SELECT *
FROM "details"
WHERE "data"::text LIKE '%"city":%'
["abc", "edf"]
。 - Chau Loi
SELECT * FROM details WHERE data::JSONB ? 'city';
- Bernhardt Scherer