You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:35:16