PostgreSQL中LIKE查询如何匹配字段长度一致的结果?
解决LIKE匹配时严格对应子串内容与长度的问题
你可以通过正则表达式匹配单词边界来实现只匹配独立的、长度与conclusion_number完全一致的子串,避免它成为其他更长字母数字序列的一部分。以下是不同数据库的具体实现方式:
1. PostgreSQL
使用正则匹配运算符~(区分大小写)或~*(不区分大小写),结合单词边界符\m(单词开头)和\M(单词结尾):
SELECT rg.task_id, a.id, a.conclusion_number, a.expertize_number, rg.id FROM registration rg JOIN audit a ON rg.expertize_number ~* ('\m' || a.conclusion_number || '\M') WHERE rg.task_id = '23402928';
2. MySQL
使用REGEXP关键字,结合MySQL专属的单词边界符[[:<:]]和[[:>:]]:
SELECT rg.task_id, a.id, a.conclusion_number, a.expertize_number, rg.id FROM registration rg JOIN audit a ON rg.expertize_number REGEXP CONCAT('[[:<:]]', a.conclusion_number, '[[:>:]]') WHERE rg.task_id = '23402928';
3. SQL Server
由于SQL Server的LIKE不支持原生单词边界,需手动判断子串前后是否为非字母数字字符,或子串位于字符串首尾:
SELECT rg.task_id, a.id, a.conclusion_number, a.expertize_number, rg.id FROM registration rg JOIN audit a ON -- 子串前后有非字母数字分隔符 rg.expertize_number LIKE '%[^a-zA-Z0-9]' + a.conclusion_number + '[^a-zA-Z0-9]%' -- 子串位于字符串开头,后续为非字母数字 OR rg.expertize_number LIKE a.conclusion_number + '[^a-zA-Z0-9]%' -- 子串位于字符串结尾,前面为非字母数字 OR rg.expertize_number LIKE '%[^a-zA-Z0-9]' + a.conclusion_number -- 子串与整个字符串完全相等 OR rg.expertize_number = a.conclusion_number WHERE rg.task_id = '23402928';
如果你的需求仅为确保conclusion_number与expertize_number中的子串长度一致且内容匹配(不限制前后字符),原LIKE条件本身已满足;若需避免子串成为其他字母数字序列的一部分,上述正则方案更贴合需求。
内容的提问来源于stack exchange,提问作者Islom
相关产品推荐
相关产品推荐

