如何比较具有相似数据的 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

Demo here

只是一个想法.. 您可以做的是在每个 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

CHECK DEMO HERE

如果另一列来自另一个 table,您可以使用 joins。也相应地使用 REPLACE 语句。