如何筛选lang_codes完全包含于输入数组的PostgreSQL表行?
PostgreSQL数组筛选:匹配所有元素存在于输入数组的行
现有PostgreSQL表结构及数据如下:
| id int | lang_codes text[] |
|---|---|
| 1 | {eng,fre} |
| 2 | {eng} |
需求
需要筛选出lang_codes数组中所有元素都存在于指定输入数组的行:
- 若输入数组为
['eng','fre','ger'],返回所有行; - 若输入数组为
['eng','ger'],仅返回id=2的行(id=1的lang_codes包含fre,不在输入数组内)。
尝试过的错误方法
- 使用
&&操作符(判断数组是否有交集):只要有一个元素匹配就返回,不符合“所有元素都存在”的要求,执行以下SQL会返回所有行:select * from my_table where lang_codes && ARRAY['eng','ger']; - 使用
@>操作符(判断右边数组是否包含左边):仅当输入数组与lang_codes完全一致时才返回,也不满足需求。
正确解法
使用<@操作符,它的作用是判断左边数组的所有元素都包含在右边数组中,完全匹配需求。
对应SQL示例:
-- 输入数组包含所有语言代码,返回全部行 select * from my_table where lang_codes <@ ARRAY['eng','fre','ger']; -- 输入数组仅包含eng和ger,仅返回id=2的行 select * from my_table where lang_codes <@ ARRAY['eng','ger'];
内容的提问来源于stack exchange,提问作者Majesty
相关产品推荐
相关产品推荐

