SQL多表查询结果不一致,Table2与Table3模糊匹配无结果原因排查
问题原因分析
- 最高概率的原因是Table2的
Team name字段为定长CHAR类型,存储时自动补了尾部空格:
多数数据库中,CHAR类型是定长存储,比如字段定义为CHAR(30),存入短于30位的队名时会自动在尾部补空格填满长度;而VARCHAR类型是变长存储,不会补空格。
你用TABLE1.TEAMNAME = TABLE2.TEAMNAME能匹配成功,是因为绝大多数数据库在做CHAR和VARCHAR的等值比较时,会自动忽略尾部空格,所以你看不到两者的差异。但做模糊匹配拼接字符串时,尾部空格会被保留,最终生成的匹配规则是%队名 %(尾部带大量空格),而Table3的队名中没有对应空格,自然匹配不到结果。 - 次大概率原因是Table2的
Team name字段携带了其他不可见字符:
比如换行符、制表符、零宽空格等,这类字符和空格逻辑一致:Table1和Table2的队名都携带了相同的不可见字符,等值匹配能通过,但模糊匹配时因为Table3的队名没有对应不可见字符,导致匹配失败。 - 极小概率原因是数据库字符串拼接规则异常:部分数据库中如果拼接的字段存在隐性空值、特殊字符集转义问题,也可能导致生成的匹配规则不符合预期。
验证&修复方案
- 先验证长度差异:分别执行两个语句查看队名字段的长度是否一致
SELECT TEAMNAME, LENGTH(TEAMNAME) AS NAME_LEN FROM TABLE1 SELECT TEAMNAME, LENGTH(TEAMNAME) AS NAME_LEN FROM TABLE2
如果相同队名的长度不一致,即可确认是尾部空格/不可见字符问题。
2. 临时修复测试:用TRIM()清除Table2队名字段的前后空白字符后再执行匹配
SELECT TABLE2.TEAMNAME, TABLE3.TEAMNAME FROM TABLE2 JOIN TABLE3 ON UPPER(TABLE3.TEAMNAME) LIKE ('%'||UPPER(TRIM(TABLE2.TEAMNAME))||'%')
如果执行后能正常返回结果,即可确认问题根源。如果仍无结果,可以用正则清除所有非可见/非字母字符再尝试匹配。
内容的提问来源于stack exchange,提问作者bobbibrown123
相关产品推荐
相关产品推荐

