匹配来自2个不同表的记录

时间:2018-07-18 12:06:31

标签: sql sql-server sql-server-2008

我有2个表(2008 mssql数据库),假设x.dbo和y.dbo

x.dbo的字段名称为“ customer name”,而y.dbo的字段名称为“ customers” ..我想要过滤所有匹配且部分匹配的客户。(条件2一起)

这是我的查询:

SELECT * FROM X JOIN Y ON UPPER(X.CustomerName) LIKE '%' + UPPER(Y.Customers) + '%' OR UPPER(Y.Customers) LIKE '%' + UPPER(X.CustomerName) + '%';

上面的查询给出了最多个匹配记录,但不是全部。

举个例子; 对于下面的这两个名称,尽管名称相似,但我的sql命令不起作用。

INSERT INTO X VALUES (N'Şemsinur Akyürek-Senle Home'), (N'Sinan Çetin Parlak'), (N'Akyakadan'); INSERT INTO Y VALUES (N'ŞEMSİNUR AKYUREK'), (N'SİNAN PARLAK'), (N'AKYA KADAN');

什么是匹配的正确代码

ŞemsinurAkyürek-Senle主页<->ŞEMSİNURAKYUREK

Akyakadan <-> AKYA KADAN

SinanÇetinParlak <->SİnanPARLAK

thx

1 个答案:

答案 0 :(得分:0)

AkyakadanAKYA KADAN不匹配,因为它有空格。您可以通过使用REPLACE()

从名称中删除所有空格来解决此问题

选择“匹配” 上面的('Akyakadan')就像replace(upper('AKYA KADAN'),'','')

Şemsinur Akyürek-Senle HomeŞEMSİNUR AKYUREK不匹配,因为Unicode中的upper('i') != 'İ'İ是304,而I是73。您可以通过运行以下内容来查看该信息:

select 
    UNICODE(N'İ'),  --304
    UNICODE(N'I')   --73

SİNANSinan都是相同的

有趣的是,lower将成为lower('İ') = 'i'。您可以通过运行以下内容查看此信息:

select 
    UNICODE(lower(N'İ')), --105
    UNICODE(N'i'),        --105

另外,关于LIKE的使用:

  

当所有参数(match_expression,pattern和scape_character,   (如果存在)是ASCII字符数据类型,则ASCII模式匹配为   执行。 如果任何一个参数属于Unicode数据类型,则全部   参数被转换为Unicode,并且Unicode模式匹配为   执行。当您使用Unicode数据(nchar或nvarchar数据类型)时   对于LIKE,尾随空格很重要

因此,假设您的归类支持UNICODE,则可以将LOWERRTRIMLTRIM函数一起使用...和REPLACE来处理空格

select *
from x
inner join y on 
    lower(ltrim(rtrim(replace(x.c1,' ','')))) like '%' + lower(ltrim(rtrim(replace(y.c1,' ','')))) + '%'
    OR lower(ltrim(rtrim(replace(y.c1,' ','')))) like '%' + lower(ltrim(rtrim(replace(x.c1,' ','')))) + '%'