如何比较具有相似数据的 2 列(例如,不同的顺序,用逗号)
How to compare 2 columns with similar data (eg. not same order, with comma)
我正在处理一个脏数据库,它没有规范化数据,并且有一个名称类似于
的列
"john kevin smith",我需要与可能具有 "Kevin john smith" 的另一列(来自其他 table)进行比较 或 "smith, kevin john" 或与原始相同,并基于此我需要弄清楚它们是否指向相同的记录。
我正在尝试弄清楚如何使用 SQL Server 2012 执行此操作。
我一直在使用 JaroWinkler 函数进行测试,但没有成功,我也尝试过使用 fnSplit 函数,但这似乎没有用,我相信我可能必须先以某种方式规范化它们,然后将它们全部分开然后相互比较,但是我在这个过程中画了一个空白。
有什么建议吗?
更新:
使用拆分函数和一些替换我能够 "normalize" 列,并在 table 函数中接收结果,如下所示:
现在我只需要弄清楚如何与另一组值进行比较,因为在执行到要与之比较的列时我会得到类似的结果。
您可以使用 STRING_SPLIT()
A table-valued function that splits a string into rows of substrings,
based on a specified separator character
SELECT a.Value
FROM STRING_SPLIT('john kevin smith', ' ') a
INNER JOIN STRING_SPLIT('Kevin john smith', ' ') b on a.Value = b.Value
只是一个想法.. 您可以做的是在每个 table 中查找并用该字段的逗号替换所有空格。将每个 table 的结果放入单独的#temp table 中。完成后.. 根据 SQL 版本执行 string_split(fnSplit),然后按字母顺序排序。
现在根据列值加入这些 table 并查看您到达的位置
为了比较,您可以只使用 EXISTS
子句。
示例数据
CREATE TABLE TEST(
VAL_A varchar(200),
VAL_B varchar(200)
);
INSERT INTO TEST (VAL_A, VAL_B) VALUES
('john kevin smith', 'Kevin john smith'),
('john kevin smith', 'Kevin, john smith'),
('Alpha beta gamma', 'beta delta alpha');
查询:
SELECT VAL_A, VAL_B
FROM TEST
WHERE NOT EXISTS (
SELECT value FROM [dbo].[fn_Split](VAL_A, ' ')
EXCEPT
SELECT value FROM [dbo].[fn_Split]((REPLACE(VAL_B,',','')), ' ')
)
OR
NOT EXISTS (
SELECT value FROM [dbo].[fn_Split]((REPLACE(VAL_B,',','')), ' ')
EXCEPT
SELECT value FROM [dbo].[fn_Split](VAL_A, ' ')
这将 return 匹配行。
+-------------------+-------------------+
| VAL_A | VAL_B |
+-------------------+-------------------+
| john kevin smith | Kevin john smith |
| john kevin smith | Kevin, john smith |
+-------------------+-------------------+
在输出中,您会注意到 alpha,beta,gamma,delta
组合没有出现,因为它们不匹配。如果您想要不匹配的行,您可以将 NOT EXISTS
更改为 EXISTS
。
如果另一列来自另一个 table,您可以使用 joins
。也相应地使用 REPLACE
语句。
我正在处理一个脏数据库,它没有规范化数据,并且有一个名称类似于
的列"john kevin smith",我需要与可能具有 "Kevin john smith" 的另一列(来自其他 table)进行比较 或 "smith, kevin john" 或与原始相同,并基于此我需要弄清楚它们是否指向相同的记录。
我正在尝试弄清楚如何使用 SQL Server 2012 执行此操作。
我一直在使用 JaroWinkler 函数进行测试,但没有成功,我也尝试过使用 fnSplit 函数,但这似乎没有用,我相信我可能必须先以某种方式规范化它们,然后将它们全部分开然后相互比较,但是我在这个过程中画了一个空白。
有什么建议吗?
更新:
使用拆分函数和一些替换我能够 "normalize" 列,并在 table 函数中接收结果,如下所示:
现在我只需要弄清楚如何与另一组值进行比较,因为在执行到要与之比较的列时我会得到类似的结果。
您可以使用 STRING_SPLIT()
A table-valued function that splits a string into rows of substrings, based on a specified separator character
SELECT a.Value
FROM STRING_SPLIT('john kevin smith', ' ') a
INNER JOIN STRING_SPLIT('Kevin john smith', ' ') b on a.Value = b.Value
只是一个想法.. 您可以做的是在每个 table 中查找并用该字段的逗号替换所有空格。将每个 table 的结果放入单独的#temp table 中。完成后.. 根据 SQL 版本执行 string_split(fnSplit),然后按字母顺序排序。
现在根据列值加入这些 table 并查看您到达的位置
为了比较,您可以只使用 EXISTS
子句。
示例数据
CREATE TABLE TEST(
VAL_A varchar(200),
VAL_B varchar(200)
);
INSERT INTO TEST (VAL_A, VAL_B) VALUES
('john kevin smith', 'Kevin john smith'),
('john kevin smith', 'Kevin, john smith'),
('Alpha beta gamma', 'beta delta alpha');
查询:
SELECT VAL_A, VAL_B
FROM TEST
WHERE NOT EXISTS (
SELECT value FROM [dbo].[fn_Split](VAL_A, ' ')
EXCEPT
SELECT value FROM [dbo].[fn_Split]((REPLACE(VAL_B,',','')), ' ')
)
OR
NOT EXISTS (
SELECT value FROM [dbo].[fn_Split]((REPLACE(VAL_B,',','')), ' ')
EXCEPT
SELECT value FROM [dbo].[fn_Split](VAL_A, ' ')
这将 return 匹配行。
+-------------------+-------------------+
| VAL_A | VAL_B |
+-------------------+-------------------+
| john kevin smith | Kevin john smith |
| john kevin smith | Kevin, john smith |
+-------------------+-------------------+
在输出中,您会注意到 alpha,beta,gamma,delta
组合没有出现,因为它们不匹配。如果您想要不匹配的行,您可以将 NOT EXISTS
更改为 EXISTS
。
如果另一列来自另一个 table,您可以使用 joins
。也相应地使用 REPLACE
语句。