查询在SQL Server中拆分名称字段

时间:2017-06-13 18:33:47

标签: sql-server

我有一个字段[名称],我需要将其分解为查询中的单独部分。该字段的格式为:

LastName,FirstName PossibleMiddle

示例值:

Doe,John Andrew
Smith,Jane

输出目标:


[LastName]          [FirstName]          [MiddleName]
----------------    ----------------     ----------------   
Doe                 John                 Andrew
Smith               Jane

以下是我迄今为止能够解决的代码:

SELECT 
LEFT([Name], CHARINDEX(',', [Name]) - 1) AS [Last Name],
SUBSTRING([Name], CHARINDEX(',', [Name]) +1, LEN([Name])) AS [First and Middle Name],
SUBSTRING([Name], CHARINDEX(',', [Name]) +1, (CHARINDEX(' ', [Name])-1)) AS [First Name]
FROM t1

由于以下几个原因,此代码不正确:
1.它失败了,因为第二个SUBSTRING没有正确制定。它假定总会有一个空格,但如果有一个中间名,实际上只有一个空格 2.我不希望[名字和中间名字]作为一个(但我认为一旦第一个问题得到解决,其余部分将落实到位)。

我觉得我错过了一些显而易见的东西,但这是一个漫长的早晨尝试,搜索,还没有解决方案。提前感谢您花时间寻找和回应。

2 个答案:

答案 0 :(得分:0)

我相信我的工作正常。基本上,我使用两个case语句,基于名称中是否有空格。

因此,如果名称中有空格,则打破第一个名称。如果没有,请占据其余部分。

{{1}}

答案 1 :(得分:0)

使用cross apply()所以我们不必为第二部分重复一个函数:

select 
    lastname   = left(t.str,charindex(',',t.str)-1)
  , firstname  = left(x.val,charindex(' ',x.val+' '))
  , middlename = nullif(right(x.val,len(x.val)-charindex(' ',x.val)),x.val)
from t
  cross apply (
    select val = stuff(t.str,1,charindex(',',t.str),'')
      ) x(val)

rextester演示:http://rextester.com/TUJNX20615

返回:

+----------+-----------+------------+
| lastname | firstname | middlename |
+----------+-----------+------------+
| Doe      | John      | Andrew     |
| Smith    | Jane      | NULL       |
+----------+-----------+------------+

扩展您的示例以包含匿名个人:

create table t (str varchar(32))
insert into t values
 ('Doe,John Andrew')
,('Smith,Jane')
,('Sting') -- mononymous 

select 
    lastname   = left(t.str,charindex(',',t.str+',')-1)
  , firstname  = nullif(left(x.val,charindex(' ',x.val+' ')),t.str)
  , middlename = nullif(right(x.val,len(x.val)-charindex(' ',x.val)),x.val)
from t
  cross apply (
    select val = stuff(t.str,1,charindex(',',t.str),'')
      ) x(val)

rextester演示:http://rextester.com/WPZXC58652

返回:

+----------+-----------+------------+
| lastname | firstname | middlename |
+----------+-----------+------------+
| Doe      | John      | Andrew     |
| Smith    | Jane      | NULL       |
| Sting    | NULL      | NULL       |
+----------+-----------+------------+