比较两个不同表中的非相同字段

时间:2017-10-12 10:49:07

标签: sql sql-server tsql sql-server-2014

我正在尝试比较2个不同表格中的名称。

Table1中,该字段被称为Name1,其值为Lynn Smith

Table2中,该字段名为Name2,其值类似于Lynn Smith (Extra)

如何比较两个名称值,忽略括号中的文字? 我想写一个查询,我需要一些主要名称相同的其他字段。

3 个答案:

答案 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会产生一个数字,该数字是模式中的第一个字符(以数字形式给出,从表达式的左边开始计算)。