SQL模式匹配:匹配column a时去除column b末尾3个字符的实现方法
你当前查询无结果的核心原因有两个:
- 关联条件里直接写
column_a like '%column_b%'会把column_b识别为固定字符串而非字段值,不会读取b列的内容做匹配 - 没有对b列做末尾3位的截断处理,原始b列的内容本身就不存在于a列中
解决方法
核心逻辑是截取b列除末尾3位外的前缀,再和a列做匹配,标准SQL写法如下:
SELECT t1.column_a, t2.column_b -- 补充你需要的其余字段 FROM t1 INNER JOIN t2 -- 截取b列去掉末尾3位的前缀,和a列做模糊匹配 ON t1.column_a LIKE CONCAT('%', LEFT(t2.column_b, LENGTH(t2.column_b) - 3), '%')
如果你的b列格式固定为8位数字+3位固定后缀,可以直接取前8位简化写法,性能也更好:
SELECT t1.column_a, t2.column_b FROM t1 INNER JOIN t2 ON t1.column_a LIKE CONCAT('%', LEFT(t2.column_b, 8), '%')
不同数据库的字符串函数略有差异,可以按需调整:
- MySQL:将
LENGTH替换为CHAR_LENGTH即可,也可以用SUBSTRING函数实现截取 - Oracle:使用
SUBSTR(t2.column_b, 1, LENGTH(t2.column_b) - 3)实现截取 - SQL Server:将
LENGTH替换为LEN即可
如果需要更高的匹配精准度,也可以提取a列中[]包裹的8位数字和b列前缀做等值匹配,避免模糊匹配带来的误匹配问题,以MySQL为例:
SELECT t1.column_a, t2.column_b FROM t1 INNER JOIN t2 -- 提取a列[]内的8位数字 ON SUBSTRING_INDEX(SUBSTRING_INDEX(t1.column_a, '[', -1), ']', 1) = LEFT(t2.column_b, 8)
内容的提问来源于stack exchange,提问作者Seanthesheep257
相关产品推荐
相关产品推荐

