Teradata SQL 如何筛选两列中姓名顺序无关的匹配行
Teradata SQL 实现方案
方案1:适配原有SQL Server逻辑
原有逻辑是将col2按空格拆分为前后两个姓名段,只要col1同时包含这两个段即满足匹配(自动忽略顺序),适配Teradata语法只需要替换两个差异点:
- 用
INSTR函数替代CHARINDEX实现子串位置查找 - 用
||替代+实现字符串拼接
适配后的查询代码:
WHERE UPPER(col1) LIKE '%' || SUBSTRING(UPPER(col2), 1, INSTR(UPPER(col2), ' ') - 1) || '%' AND UPPER(col1) LIKE '%' || SUBSTRING(UPPER(col2), INSTR(UPPER(col2), ' ') + 1) || '%'
注:Teradata的SUBSTRING如果省略长度参数,默认截取到字符串末尾,可简化写法
方案2:使用STRTOK函数简化写法
Teradata内置的STRTOK拆分函数更适合按分隔符取指定位置的子串,代码可读性更高:
WHERE UPPER(col1) LIKE '%' || UPPER(STRTOK(col2, ' ', 1)) || '%' AND UPPER(col1) LIKE '%' || UPPER(STRTOK(col2, ' ', 2)) || '%'
STRTOK(col2, ' ', 1)表示按空格拆分col2取第1个分段,STRTOK(col2, ' ', 2)取第2个分段,和原有逻辑完全等效。
效果验证
针对你提供的测试数据:
| col1 | col2 | 匹配结果 |
|---|---|---|
| Adam Nowak PHU | Nowak Adam | 匹配 |
| AAR Kowal Jan | Kowal Jan | 匹配 |
| Tomasz Gut | Juk Anna | 不匹配 |
两个方案都只会返回前两行,完全符合预期。
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

