1

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

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

  • 史密斯医学博士
  • 乔治医学博士
  • 史密斯医学博士有限责任公司
  • 史密斯JR 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 并将清理后的数据转储到单独的表中。因此,我可以使用该新表中的数据进行进一步处理。

4

2 回答 2

0

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

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

希望能帮助到你

于 2013-11-13T04:44:19.540 回答
0

如果您可以选择使用基于 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;

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

于 2013-11-13T06:46:50.123 回答