PostgreSQL中@>数组包含操作符查询返回空结果问题排查
Postgres数组类型标签包含查询无结果解决方案
问题背景
现有存储帖子数据的posts表,表中包含varchar[]类型的tags字段存储帖子标签,需要筛选出标签字段包含目标标签集合全部元素的帖子。
问题表现
根据PostgreSQL数组函数规则,使用数组包含操作符@>进行查询,执行以下两条查询语句均返回空结果:
select * from posts where tags @> '{"California", "K-8"}';
select * from posts where tags @> array['California', 'K-8']::varchar[];
但表中实际存在两条符合匹配条件的帖子,对应的tags字段值为:{'California','K-8','Legislation','AB77'}、{'California','K-8','Tips & Tricks'}
根因定位与解决
问题根源为存储的数组数据格式不符合PostgreSQL规范:
原有存储的数组元素使用单引号包裹,相当于单引号被写入了标签内容本身,和查询语句中不带单引号的标签无法匹配。将原有错误格式{'California','K-8','Tips & Tricks'}修改为符合规范的格式{California,K-8,"Tips & Tricks"}后,查询即可正常返回结果。
补充说明:PostgreSQL数组字面量中,无特殊字符的元素无需额外加引号,包含空格、特殊符号的元素使用双引号包裹即可,不可使用单引号作为数组元素的包裹符。
内容的提问来源于stack exchange,提问作者Pavel Shepelenko
相关产品推荐
相关产品推荐

