【问题标题】:How to Remove Titles and Suffixes from "Last Name" column?如何从“姓氏”列中删除标题和后缀?
【发布时间】:2013-11-13 04:27:27
【问题描述】:

谁能告诉我以下场景是否可以在 SQL Server 中实现?

场景: 在表中有一个“姓氏”列,其值如下:

  • 史密斯 MD
  • 乔治 医学博士
  • 史密斯 MD LLC
  • SMTITH JR MD
  • 史密斯 III MD PA
  • 史密斯,医学博士

换句话说,“姓氏”有很多标题或后缀。我想使用 SQL 清理这些数据。目前,我正在多个视图中执行此操作,例如,首先仅删除“MD”,然后在下一个视图中删除“LLC”或“JR”等等。

相反,我可以将所有这些可能的后缀/标题转储到一个表中,除了姓氏,然后再次检查该表的姓氏,如果在“姓氏”的末尾找到该字符串,则将其从中删除列?

类似:

LOCATE(a.LastName, IN (Select Suffix/Title from Code table)) > 0

然后再次查看代码表删除整个字符串。示例:

Last name is like SMITH MD

代码表将有 2 列:

Code   Logic
MD     SUBSTRING(a.LastName, 1, length(a.NEWlastname) - 2) 

删除姓氏的 MD 并将清理后的数据转储到单独的表中。因此,我可以使用该新表中的数据进行进一步处理。

【问题讨论】:

  • 尝试使用纯 SQL 执行数据清理听起来很糟糕。 SSIS 在这里有一些功能:Clicky!

标签: sql-server tsql data-cleaning


【解决方案1】:

看来您只需要姓氏。 姓氏后面总是跟一个空格。您可以使用此空格来标识姓氏的结尾并避免以下任何内容:

SELECT DISTINCT YT.USER_NAME,
                SUBSTR(YT.USER_NAME, 0, INSTR(YT.USER_NAME, ' ') - 1) AS ONLY_NAME
  FROM YOUR_TABLE YT

希望对你有帮助

【讨论】:

  • 此解决方案并非在所有情况下都有效。 OP 在他的示例数据(最后一行似乎格式不正确)中显示了一个没有空格的案例,只有一个逗号。它也不允许姓氏中有空格。此外,INSTR 不是 SQL Server 函数。
【解决方案2】:

如果您可以选择使用基于 SQLCLR 的函数,那么您可以使用正则表达式来简单地删除一个或多个匹配的后缀。 RegEx“替换”可以在单个调用中匹配任意数量的后缀(使用管道“|”来“或”后缀)并将每个后缀替换为空字符串。正则表达式可以轻松匹配每个后缀前面的字符组合:空格、逗号(示例数据中的两个),以及逗号和空格,甚至空格加逗号加空格。这种方法允许姓氏中包含空格。您可以(根据您的要求)填充后缀表,但无需存储删除后缀的逻辑。

以下示例使用了包含 RegEx_Replace 函数的 SQL# 库。我是SQL#的作者,但是这个功能是免费版的。或者,如果您只想要一个没有其他所有功能的 RegEx“替换”功能,那么各种论坛/博客/文章/等上有很多示例。

在下面的示例中,我包括了两个额外的测试用例:一个带有逗号和空格(表明两者都被删除),另一个没有定义为后缀(表明它之前的空格没有被删除) .

DECLARE @TestNames TABLE (LastName NVARCHAR(50));
INSERT INTO @TestNames VALUES
        (N'SMITH MD'),
        (N'GEORGE MD PHD'),
        (N'SMITH MD LLC'),
        (N'SMTITH JR MD'),
        (N'SMITH III MD PA'),
        (N'SMITH,MD'),
        (N'SMITH, IV'),
        (N'SMITH NotDefined');

DECLARE @NameSuffixes TABLE (Suffix NVARCHAR(50));
INSERT INTO @NameSuffixes VALUES
        (N'MD'),
        (N'PHD'),
        (N'llc'),
        (N'II'),
        (N'III'),
        (N'iv'),
        (N'jr'),
        (N'pa');

-- Pattern =
-- (([, ]+MD\b)|([, ]+PHD\b)|([, ]+llc\b)|([, ]+II\b)|([, ]+III\b)|...)
DECLARE @SuffixList NVARCHAR(4000) = N'(';
SELECT @SuffixList += N'([, ]+' + Suffix + N'\b)|'
FROM @NameSuffixes;
SET @SuffixList += N')';

SELECT tn.LastName, 
    SQL#.RegEx_Replace(tn.LastName, @SuffixList, '', -1, 1, N'IgnoreCase') + N'~'
FROM @TestNames tn;

请注意,附加到每个过滤值的~ 只是为了表明没有尾随空格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多