努力将两个遗留数据库系统连接到新数据库中,我可以避免像下面所见的愚蠢问题。我试图在文本数据不同的两个表上进行连接,除了在另一个表中没有使用实际的完整姓氏的情况之外,它通常有效。还有其他列是连接的一部分,但我仍然需要在这两列上执行连接以获得正确的结果。
Table1.Column Table2.Column Miller 01 Miller Grant 1-3 Grant Rice/Bennet 2A Rice
所以(CHARINDEX(table1.column,Table2.Column)> 0)在姓氏与Rice / Bennet<>之间略有不同时使用excpet 02饭。
最好的办法是什么?一般来说,这种类型的Senario是唯一的阻碍。
更新:我在想,或许更简单的方法是将任何数字和字符替换为table2.column中的第一个空格,并将其用于table1.column?我在前几年发现,前几个字符可能是数字或字母,但在姓氏开头之前有一个空格
答案 0 :(得分:2)
根据您问题的更新,如果您要删除前几个字符(包括第二列中的空格)并将其与第一列进行比较,就像您所描述的那样,这就是您可以在WHERE子句中记下的内容。
(CHARINDEX(RIGHT(table2.column,len(table2.column)-CHARINDEX('',table2.column)),table1.column)> 0)
答案 1 :(得分:0)
你有错误的方法:
select charindex('bcd','abcde')
给出2
select charindex('abcde','bcd')
给出0
罗布
答案 2 :(得分:0)
CHARINDEX(或PATINDEX)的第一个参数必须是第二个参数的子字符串。这两个函数都不够智能,无法匹配子字符串的特定部分。 'Rice Rice'中找不到'Rice / Bennet'。例子:
CHARINDEX('Miller', '01 Miller') = 4
CHARINDEX('Grant', '03 Grant') = 4
CHARINDEX('Rice/Bennet', '02 Rice') = 0
为了使查询起作用,您需要构建一个内联视图,在其中解析Table1.Column值以处理这些情况。 CHARINDEX / PATINDEX告诉我们您正在使用SQL Server - 如果它是2005+,您可以使用公用表表达式(CTE)。
JOIN (SELECT CASE
WHEN CHARINDEX('/', t.column) > 0 THEN
SUBSTRING(t.column, 0, CHARINDEX('/', t.column)-1)
ELSE
t.column
END AS column
FROM TABLE1 t) t1 ON CHARINDEX(t1.column, Table2.column) > 0
请注意,在示例中,“Bennet”不会用于检查表2中的相应条目。