我有一个字段[名称],我需要将其分解为查询中的单独部分。该字段的格式为:
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.我不希望[名字和中间名字]作为一个(但我认为一旦第一个问题得到解决,其余部分将落实到位)。
我觉得我错过了一些显而易见的东西,但这是一个漫长的早晨尝试,搜索,还没有解决方案。提前感谢您花时间寻找和回应。
答案 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 |
+----------+-----------+------------+