PostgreSQL如何用单个数组参数查询JSON属性匹配指定值
PostgreSQL动态匹配JSON属性:用单个属性名数组实现OR逻辑
可以实现,推荐使用jsonb_each_text(或json_each_text,取决于你的JSON字段类型)结合EXISTS子查询的方案,完美满足你用单个属性名数组参数的需求,且完全参数化避免SQL注入风险。
具体查询语句
假设你的JSON字段是jsonb类型(如果是json类型,把jsonb_each_text替换为json_each_text即可):
SELECT * FROM mytable WHERE EXISTS ( SELECT 1 FROM jsonb_each_text(mytable.data) AS j(key, value) WHERE j.key = ANY($1) AND j.value = $2 )
参数传递方式
调用时直接传入两个参数:
$1:属性名数组,比如['foo', 'bar']$2:目标值,比如'hello'
原理说明
jsonb_each_text会将data字段的JSON对象拆分为多行键值对(每行对应一个key-value)EXISTS子查询检查是否存在任意一行满足:键在传入的属性名数组中,且值等于目标值- 这个逻辑完全等价于
data.foo = 'hello' OR data.bar = 'hello',但无需手动展开属性数组,不管数组长度多少都能适配
额外说明
如果需要处理嵌套JSON属性,或者更复杂的匹配逻辑,可以基于这个思路扩展,但针对你当前的需求,上述方案已经足够简洁高效。
内容的提问来源于stack exchange,提问作者JHH
相关产品推荐
相关产品推荐

