PostgreSQL中如何编写JSONB数组条件查询语句?
PostgreSQL JSONB数组查询实现方案
我有一张Table_A表,结构和数据如下:
| name | email_addresses |
|---|---|
| a | ['test@test.com'] |
| b | ['test@test.com', 'test2@test.com'] |
| c | ['aatest@test.com', 'bbtest2@test.com'] |
| d | ['test@test.com', 'test2@test.com', 'aa@bb.cc'] |
其中email_addresses字段类型为JSONB。需要查询**不同时包含test@test.com和test2@test.com**的记录(预期结果为name为a、c、d的记录),以下是两种可行的PostgreSQL查询写法:
方法1:使用NOT + @>操作符
@>是PostgreSQL JSONB类型的包含操作符,用于判断左侧数组是否包含右侧数组的所有元素。加上NOT即可排除同时拥有两个指定邮箱的记录:
SELECT * FROM Table_A WHERE NOT (email_addresses @> '["test@test.com", "test2@test.com"]'::jsonb);
方法2:遍历数组元素统计匹配数
通过jsonb_array_elements_text展开数组元素,统计匹配指定邮箱的数量,筛选出匹配数小于2的记录:
SELECT t.* FROM Table_A t WHERE ( SELECT COUNT(*) FROM jsonb_array_elements_text(t.email_addresses) e WHERE e IN ('test@test.com', 'test2@test.com') ) < 2;
说明
两种方法都能得到预期结果:
- 方法1更简洁高效,适合直接判断数组包含关系的场景;
- 方法2灵活性更强,可扩展用于更复杂的元素匹配统计需求。
内容的提问来源于stack exchange,提问作者alexmorgan.cr
相关产品推荐
相关产品推荐

