我有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
答案 0 :(得分:0)
Akyakadan
与AKYA 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İNAN
和Sinan
都是相同的
有趣的是,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
,则可以将LOWER
与RTRIM
和LTRIM
函数一起使用...和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,' ','')))) + '%'