PostgreSQL中含下划线的SQL字符串精准匹配问题
问题根源
PostgreSQL的LIKE语法里,_是匹配任意单个字符的通配符,不是字面意义的下划线。你写的%_21_%会匹配所有包含「任意单字符+21+任意单字符」的字符串,比如示例里的_215_会被命中(_通配符匹配了21后面的5),所以才会和%_215_%返回相同结果。
解决方案
有两种精准匹配的实现方式:
方式1:转义下划线(基于LIKE查询)
用ESCAPE关键字把下划线转义为字面字符,同时覆盖开头、中间、结尾三种场景:
SELECT * FROM table_name WHERE -- 匹配开头的"21_" subjects LIKE '21_%' ESCAPE '\' -- 匹配中间的"_21_" OR subjects LIKE '%\_21\_%' ESCAPE '\' -- 匹配结尾的"_21" OR subjects LIKE '%\_21' ESCAPE '\';
方式2:数组匹配(更简洁精准)
将subjects按下划线分割成数组,直接检查数组是否包含目标值,无需处理通配符:
-- 精准匹配包含"21"的记录 SELECT * FROM table_name WHERE string_to_array(subjects, '_') @> ARRAY['21']; -- 精准匹配包含"215"的记录 SELECT * FROM table_name WHERE string_to_array(subjects, '_') @> ARRAY['215'];
验证示例
针对你的示例字符串110_112_120_122_130_132_140_143_149_151_154_160_162_165_171_173_194_215_236_257_278_299:
- 用数组匹配
'21'不会命中该记录 - 匹配
'215'会命中,完全符合预期
内容的提问来源于stack exchange,提问作者Mayur Bendkhale
相关产品推荐
相关产品推荐

