比较字母无论顺序SQL

时间:2018-09-27 15:31:51

标签: sql sql-server

如果顺序在SQL Server中不重要,如何比较两个字符串?

例如,如果我有两个名字:

Column 1        | Column 2
___________________________________
John Doe        | Doe, John
Stella Maris    | Maris, Stella
Nima Lima       | Lima, Nima
Jensen, James   | James Jensen
Katrina Blade   | Katrina the Blade

因此它说除最后一个以外的所有其他都是相同的?

仅凭CASE WHEN [Column 1] = [Column 2] THEN 1 ELSE 0 END语句是不可能的。是否有可能将名称标记为字母,通过清理功能运行它以删除标点符号,然后比较我按顺序排列的字母是否相等?可以用SQL完成吗?

1 个答案:

答案 0 :(得分:0)

上面有一个非常有趣的注释字符串,但是OP的要求似乎很简单:[first last]或[last,first]格式的名字+姓氏是否匹配?如果就这么简单,您可以像这样重新格式化column1和column2:

CREATE table #T1 (column1 nvarchar(max), column2 nvarchar(max))
INSERT INTO #T1 (column1, column2)
VALUES
('John Doe', 'Doe, John')
,('Stella Maris', 'Maris, Stella')
,('Nima Lima', 'Lima, Nima')
,('Jensen, James', 'James Jensen')
,('Katrina Blade', 'Katrina the Blade')

SELECT column1, column2,
    RTRIM(
        LTRIM(
            SUBSTRING(column1, CHARINDEX(',', column1) + 1, LEN(column1) - CHARINDEX(',', column1)) 
            + CASE 
            WHEN CHARINDEX(',', column1) > 0 
            THEN ' ' + LEFT(column1, CHARINDEX(',', column1) - 1) 
            ELSE ''
            END
            -- or if using SQL Server 2017 TRIM(',', LEFT(column1, CHARINDEX(',', column1)))
        )
    ),
    RTRIM(
        LTRIM(
            SUBSTRING(column2, CHARINDEX(',', column2) + 1, LEN(column2) - CHARINDEX(',', column2)) 
            + CASE 
            WHEN CHARINDEX(',', column2) > 0 
            THEN ' ' + LEFT(column2, CHARINDEX(',', column2) - 1) 
            ELSE ''
            END
            -- or if using SQL Server 2017 TRIM(',', LEFT(column2, CHARINDEX(',', column2)))
        )
    )  
FROM #T1