有没有人可以告诉我是否可以在SQL Server中实现以下方案?
方案: 在表格中有一个“姓氏”列,其值如下:
换句话说,“姓氏”有很多标题或后缀。我想用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作为姓氏,并将已清理的数据转储到单独的表中。所以我可以使用新表中的数据进行进一步处理。
答案 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;
请注意,每个过滤值附加的~
只是为了表明没有尾随空格。