Sql server 名称拆分和比较
我的情况是,我需要执行以下操作: 公司名称:Sql server 名称拆分和比较,sql-server,Sql Server,我的情况是,我需要执行以下操作: 公司名称: a. Split text before and after “ - “ b. Generate the report where texts before and after “ - “ matches = exact match c. Generate the report where texts before and after “ - “ matches = similar matches 我可以到达b点。其中,我可以使用以下公式获得具有相
a. Split text before and after “ - “
b. Generate the report where texts before and after “ - “ matches = exact match
c. Generate the report where texts before and after “ - “ matches = similar matches
我可以到达b点。其中,我可以使用以下公式获得具有相同上半部分和下半部分(例如abc,inc.-abc,inc.)名称的结果-
RTRIM(substring(c.companyname,0,charindex('-',c.companyname)))= LTRIM(substring(c.companyname, charindex('-',c.companyname,0)+1, len(c.companyname)))
但是,我无法完成下一份报告(例如abc.-abc或abc,inc.-abc)
有人能帮忙吗?试试这个
DECLARE @CompanyNames TABLE (
CompanyName VARCHAR(512));
INSERT INTO @CompanyNames VALUES ('Walt Disney - Walt Disney');
INSERT INTO @CompanyNames VALUES ('Fun Food - Fun Food');
INSERT INTO @CompanyNames VALUES ('Fun Food, Inc. - Fun Food');
INSERT INTO @CompanyNames VALUES ('Walt Disney - Walt Disney, Inc.');
--Split names
DECLARE @SplitNames TABLE (
MatchLeft VARCHAR(128),
MatchRight VARCHAR(128));
INSERT INTO
@SplitNames
SELECT
RTRIM(SUBSTRING(CompanyName, 0, CHARINDEX('-', CompanyName))),
LTRIM(SUBSTRING(CompanyName, CHARINDEX('-', CompanyName, 0) + 1, LEN(CompanyName)))
FROM
@CompanyNames;
--Exact matches
SELECT
MatchLeft,
MatchRight,
CASE WHEN MatchLeft = MatchRight THEN 1 ELSE 0 END AS Exact
FROM
@SplitNames;
--Inexact matches
WITH CleansedCompanyNames AS (
SELECT
MatchLeft AS OriginalMatchLeft,
MatchRight AS OriginalMatchRight,
REPLACE(REPLACE(REPLACE(MatchLeft, '.', ''), 'Inc', ''), ',', '') AS MatchLeft,
REPLACE(REPLACE(REPLACE(MatchRight, '.', ''), 'Inc', ''), ',', '') AS MatchRight
FROM
@SplitNames)
SELECT
OriginalMatchLeft,
OriginalMatchRight,
MatchLeft,
MatchRight,
CASE WHEN MatchLeft = MatchRight THEN 1 ELSE 0 END
FROM
CleansedCompanyNames;
--Using SOUNDEX
SELECT
MatchLeft,
MatchRight,
CASE WHEN DIFFERENCE(MatchLeft, MatchRight) >= 3 THEN 1 ELSE 0 END AS Score
FROM
@SplitNames;
处理不精确匹配有两种方法:
- 在匹配之前删除标点符号和不需要的单词(但这需要建立一个替换内容的列表);或
- 使用SOUNDEX测试字符串的相似性
SELECT ...
WHERE
DIFFERENCE(RTRIM(substring(c.companyname,0,charindex('-',c.companyname))), LTRIM(substring(c.companyname, charindex('-',c.companyname,0)+1, len(c.companyname)))) >= 3
以你最近的例子:
DECLARE @Company TABLE (
companyname VARCHAR(500));
INSERT INTO @Company VALUES ('Allen Limited - Allen Corporation');
INSERT INTO @Company VALUES ('Sweden Corp. - Sweden Corp.');
INSERT INTO @Company VALUES ('Alaska Limited - Alaska Limited, Inc.');
INSERT INTO @Company VALUES ('New York Inc. - New York Steel Limited');
INSERT INTO @Company VALUES ('India Plc - India Plc.');
INSERT INTO @Company VALUES ('Dubai International - Dubai International');
INSERT INTO @Company VALUES ('Nigera Falls Pvt. Ltd. - Amazing Nigeria Falls');
SELECT
c.companyname,
DIFFERENCE(RTRIM(SUBSTRING(c.companyname, 0, CHARINDEX('-', c.companyname))), LTRIM(SUBSTRING(c.companyname, CHARINDEX('-', c.companyname, 0) + 1, LEN(c.companyname)))) AS Similarity
FROM
@Company c;
结果如下:
companyname Similarity
Allen Limited - Allen Corporation 4
Sweden Corp. - Sweden Corp. 4
Alaska Limited - Alaska Limited, Inc. 4
New York Inc. - New York Steel Limited 4
India Plc - India Plc. 4
Dubai International - Dubai International 4
Nigera Falls Pvt. Ltd. - Amazing Nigeria Falls 1
因此,对于您的最后一个示例,它的效果不是很好,但对于其他示例来说似乎很好?请编辑您的问题,并提供示例数据和所需结果。名称:Walt Disney-Walt Disney Fun Food-Fun Food Fun Food,Inc.-Fun Food Walt Disney-Walt Disney,Inc.。我已经拥有的查询允许我仅提取第1行和第2行的RTRIM(子字符串(c.companyname,0,charindex('-',c.companyname))=LTRIM(子字符串(c.companyname,charindex('-',c.companyname,0)+1,len(c.companyname)))我想要一个查询,在那里我也可以得到第3行和第4行,因为它们也是相同的名字和姓氏大小写,但略有不同(例如,有点(.)或额外的单词(Inc.)它是有效的,但我刚才在上面的查询中引用了一些例子。我要检查的记录很多,可能会有所不同,不仅仅是因为“Inc”这个词。它可以是任何东西-神奇的土地-神奇的土地,有趣的食物-有趣的食物。这就是为什么我提供了两个例子,SOUNDEX差异将评估两个字符串的相似性,应该是b是否值得一试?就我个人而言,我更喜欢更稳健的距离算法(例如Jaro Winkler)但这一点要实现起来有点困难,因为它没有内置到引擎中。是的,这与我给出的示例名称是一致的。但是如果我必须从名为“name”的列中选择名称,我该如何使用它。现在我们使用-INSERT into@CompanyNames VALUES('Fun Food-Fun Food'));我不知道如何在列中使用它?如果有:RTRIM(子字符串(c.companyname,0,charindex('-',c.companyname))=LTRIM(子字符串(c.companyname,charindex('-',c.companyname,0)+1,len(c.companyname)),使用:差(RTRIM(子字符串(c.companyname,0,charindex('-',c.companyname))),LTRIM(子字符串(c.companyname,charindex)),c.companyname(“-”,c.companyname,0)+1,len(c.companyname)))>=3您可能需要处理数字,4是最佳匹配,3是正常的,2是较差的,等等。不起作用!生成报告,其中“-”前后的文本匹配=相似