我正在尝试比较2个不同表格中的名称。
在Table1
中,该字段被称为Name1
,其值为Lynn Smith
。
在Table2
中,该字段名为Name2
,其值类似于Lynn Smith (Extra)
如何比较两个名称值,忽略括号中的文字? 我想写一个查询,我需要一些主要名称相同的其他字段。
答案 0 :(得分:3)
一种方法可以使用like
:
select . . .
from t1 join
t2
on t2.name2 like t1.name1 + ' (%)';
然而,这可能效率不高。如果需要性能,可以将名称提取到第二个表中的单独列中,并在其上创建索引:
alter table t2 add column name_cleaned as
(left(name2, charindex(' (', name2 + ' (') - 2));
create index idx_t2_name_cleaned on t2(name_cleaned);
然后您可以将查询短语为:
select . . .
from t1 join
t2
on t2.name2_cleaned = t1.name1;
答案 1 :(得分:0)
执行此操作的一种方法是在清洁后直接比较名称。 与戈登的回答不同,我会用另一个包含要从table2进行比较的数据的表来执行此操作。
SELECT Table2Id, Name2, NULL as cleanedName INTO NewTable FROM Table2
现在我们更新cleaningName列以从Name2列中删除额外信息,如下所示。您也可以在此表上创建索引。
UPDATE cleanedName
SET cleanedName = LEFT (name2,CHARINDEX('(',Name2))
现在在CleanedName列上删除并重新创建索引,然后与Table1.Name1列进行比较
答案 2 :(得分:0)
如果Table2 Column2中的所有值在第二个名称的末尾和第一个(打开)括号之间有空格,那么您可以使用它:
SELECT SUBSTRING('Lynn Smith (Extra)',1,PATINDEX('%(%','Lynn Smith (Extra)')-2)
如果你用列名取代'Lynn Smith(Extra)':
SELECT SUBSTRING('name2',1,PATINDEX('%(%','name2')-2)
然后它将显示name2中没有括号中文本的值列表,换句话说,与table1上name1中的名称格式相同(如此)。
SUBSTRING和PATINDEX是字符串函数。
SUBSTRING要求三个'参数':(1)表达式(2)开始和(3)长度。
(1)如上所示,第一个参数可以是(除其他外) 要么是常数 - '林恩史密斯(额外)'还是列 - '名称2'
(2)你想要的结果的开始,在这个例子中,第一个(或左) 列中的字符串中的字符或常量由数字1表示。
(3)您希望在结果中看到多少个字符?在这个例子中,我使用了PATINDEX来创建一个数字(见下文)。
PATINDEX要求两个参数:(1)%pattern%和(2)expression
(1)是您正在寻找的字符或字符组(形状或“图案”) 找到,通配符字符%%的原因 模式是因为模式的任一侧可能有字符
(2)是(除其他外)包含模式的常量或列 来自论点1。
虽然SUBSTRING返回字符数据(字符串的一部分),但PATINDEX会产生一个数字,该数字是模式中的第一个字符(以数字形式给出,从表达式的左边开始计算)。