SQL中如何截取空格前字符实现两表姓名字段关联匹配
问题原因
原查询逻辑存在边界缺陷:当名字字段中没有空格时,CHARINDEX(' ', 待匹配字段)会返回0,此时0-1 = -1,LEFT函数传入负长度参数会返回空值,自然无法匹配到不含中间空格的名字,这就是Kristin匹配失败的核心原因。
解决方案
核心逻辑调整为:判断字段中是否存在空格,有空格则取第一个空格前的内容,没有空格则直接取整个字段的值,统一转大写后匹配。
SQL Server 环境可用语句
SELECT * FROM table1 A JOIN table2 B ON UPPER(CASE WHEN CHARINDEX(' ', A.FIRST_NAME) > 0 THEN LEFT(A.FIRST_NAME, CHARINDEX(' ', A.FIRST_NAME) - 1) ELSE A.FIRST_NAME END) = UPPER(CASE WHEN CHARINDEX(' ', B.FIRSTNAME) > 0 THEN LEFT(B.FIRSTNAME, CHARINDEX(' ', B.FIRSTNAME) - 1) ELSE B.FIRSTNAME END)
MySQL 环境可用语句
将CHARINDEX替换为MySQL对应的LOCATE函数即可:
SELECT * FROM table1 A JOIN table2 B ON UPPER(CASE WHEN LOCATE(' ', A.FIRST_NAME) > 0 THEN LEFT(A.FIRST_NAME, LOCATE(' ', A.FIRST_NAME) - 1) ELSE A.FIRST_NAME END) = UPPER(CASE WHEN LOCATE(' ', B.FIRSTNAME) > 0 THEN LEFT(B.FIRSTNAME, LOCATE(' ', B.FIRSTNAME) - 1) ELSE B.FIRSTNAME END)
如果需要额外处理字段首尾多余空格的影响,可以在每个字段外层再加TRIM函数包裹即可。
内容的提问来源于stack exchange,提问作者G4Gaurab
相关产品推荐
相关产品推荐

