【发布时间】:2016-03-24 07:52:22
【问题描述】:
我写了这样的查询来检查 json 列是否有键
SELECT *
FROM "details"
where ("data"->'country'->'state'->>'city') is not null;
但我需要编写查询,如果“数据”包含“城市”,它将选择行
json数据结构不一致。
【问题讨论】:
标签: sql json postgresql
我写了这样的查询来检查 json 列是否有键
SELECT *
FROM "details"
where ("data"->'country'->'state'->>'city') is not null;
但我需要编写查询,如果“数据”包含“城市”,它将选择行
json数据结构不一致。
【问题讨论】:
标签: sql json postgresql
您可以使用? 来检查data 的顶级 键,正如documentation 中所说。
例如
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::JSONB ? 'city';
你可以使用?:
SELECT *
FROM "details"
where data->'country'->'state' ? 'city';
【讨论】:
您可以将您的 json 转换为文本并使用 LIKE 搜索密钥
SELECT *
FROM "details"
WHERE "data"::text LIKE '%"city":%'
【讨论】:
["abc", "edf"]