问题描述
Table t
id | keys (jsonb)
---+----------------
1 | ["Key1","Key2"]
我的目标是查询此表以找出jsonb数组列“ keys”中是否包含列表的键之一。
我设法使用以下方法获得结果
SELECT *
FROM t
WHERE keys ?| Array ['Key1','Key2'];
我找不到通过在表中的“键”值上应用lower()来扩大查询范围的方法。
是否有一种方法可以遍历元素以将lower()应用于每个元素?
解决方法
您可能需要取消嵌套这两个数组:
select *
from t
where exists (
select 1
from jsonb_array_elements_text(t.keys) k1(val)
inner join unnest(array['Key1','Key2']) k2(val)
on lower(k1.val) = lower(k2.val)
)
,
由于上面的回复,我设法找到了一种做到这一点的方法:
SELECT *
FROM t,jsonb_array_elements_text(keys) key
WHERE lower(key) in ('key1','key2') ;