如何从“姓氏”列中删除标题和后缀?

时间:2013-11-13 04:27:27

标签: sql-server tsql data-cleansing

有没有人可以告诉我是否可以在SQL Server中实现以下方案?

方案: 在表格中有一个“姓氏”列,其值如下:

  • SMITH MD
  • GEORGE MD PHD
  • SMITH MD LLC
  • SMTITH JR MD
  • SMITH III MD PA
  • SMITH 下,MD

换句话说,“姓氏”有很多标题或后缀。我想用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作为姓氏,并将已清理的数据转储到单独的表中。所以我可以使用新表中的数据进行进一步处理。

2 个答案:

答案 0 :(得分:0)

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

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

希望有所帮助

答案 1 :(得分:0)

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

以下示例使用包含 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;

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