【发布时间】:2020-04-19 15:02:24
【问题描述】:
给定一个名为 pairs 的 jsonb 列,在单个记录中包含如下数据:
{ "foo": 1, "bar": 2 }
如何查询给定值是上述字段中的值之一的记录。
例如,查询 1 将匹配上述记录。
3 的查询不匹配。
PostgreSQL 9.5
【问题讨论】:
标签: json postgresql jsonb postgresql-9.5
给定一个名为 pairs 的 jsonb 列,在单个记录中包含如下数据:
{ "foo": 1, "bar": 2 }
如何查询给定值是上述字段中的值之一的记录。
例如,查询 1 将匹配上述记录。
3 的查询不匹配。
PostgreSQL 9.5
【问题讨论】:
标签: json postgresql jsonb postgresql-9.5
在 Postgres 9.5 中,在横向连接中使用函数 jsonb_each_text():
with my_table(pairs) as (
values
('{ "foo": 1, "bar": 2 }'::jsonb)
)
select t.*
from my_table t
cross join jsonb_each_text(pairs)
where value = '1';
升级到 Postgres 12 并使用 json 路径函数,例如:
select *
from my_table
where jsonb_path_exists(pairs, '$.* ? (@ == 1)')
【讨论】:
with 和cross join 子句的情况下是否可以在PostgreSQL 9.5 中执行此操作?仅使用select 和left join 或inner join?
with 语句不是必需的,在这个例子中它就像你的原始表一样。 cross join 在这里并不表示笛卡尔积,因为它是横向连接。但是,如果您愿意,可以将其替换为 left join。见Db<>fiddle.
WHERE 子句中使用jsonb_each_text(),但横向连接更简单、更快。重点是9.5中没有jsonb_path_exists()这样的函数,所以要使用集合返回函数jsonb_each_text()。