2017-03-09 54 views
1

我有應該分爲名字,姓氏和中間名的全名。 以下是我的示例名稱。如何從SQL中的給定字符串提取子字符串

1. WILLEMS, JAN MARIE J 
2. HLAVACEK, PATRICIA K 
3. KLIMEK, CHRISTOPHER 

現在我的名字,中間名和姓氏應該是

Firstname Lastname Middlename 
JAN MARIE WILLEMS  J 
PATRICIA  HLAVACEK  K 
CHRISTOPHER KLIMEK 

我試着用下面的查詢。

  declare @FullName varchar(100)='KLIMEK, CHRISTOPHER' 
Select 
    LTRIM(RTRIM(SUBSTRING(@FullName, 0, CHARINDEX(',', @FullName)))) As LastName 
,SUBSTRING(@FullName,CHARINDEX(' ',LTRIM(RTRIM(@FullName)))+1,(LEN(LTRIM(RTRIM(@FullName)))-CHARINDEX(' ',LTRIM(RTRIM(@FullName)))-CHARINDEX(' ',REVERSE(LTRIM(RTRIM(@FullName)))))) 
,SUBSTRING(@FullName , LEN(LTRIM(RTRIM(@FullName))) - CHARINDEX(' ',REVERSE(LTRIM(RTRIM(@FullName)))) + 2 , LEN(LTRIM(RTRIM(@FullName)))) 

當它沒有中間名時,這不會給出正確的答案。

您能否提供您的意見?名

+0

什麼SQL引擎和版本嗎? 然後,你期望多首字母縮寫嗎? – gbn

+0

SQL 2012.不是多個姓名縮寫。名字可以有或沒有首字母縮寫 – chits

+0

用逗號分隔,從前面移除空格然後按空格分隔。 – Snowlockk

回答

1

提取零件會導致混亂,但是這可能會做你的需要:

select 
    Firstname = left(rest,len(rest)-charindex(' ',reverse(rest))) 
    , Lastname 
    , Middlename = case 
     when charindex(' ',rest)>0 
     then right(rest,charindex(' ',reverse(rest))-1) 
     else '' 
     end 
from (
    select 
     Lastname = left(name, charindex(',',name+',')-1) 
    , rest  = ltrim(rtrim(stuff(name, 1,charindex(',',name+','),''))) 
    from t 
) as s 

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

回報:

+-------------+----------+------------+ 
| Firstname | Lastname | Middlename | 
+-------------+----------+------------+ 
| JAN MARIE | WILLEMS | J   | 
| PATRICIA | HLAVACEK | K   | 
| CHRISTOPHER | KLIMEK |   | 
+-------------+----------+------------+ 

如果middlename應始終只是一箇中間首字母,長度爲1,這將適應吃了:

select 
    Firstname = case 
     when charindex(' ',reverse(rest))=2 
     then left(rest,len(rest)-2) 
     else rest 
     end 
    , Lastname 
    , Middlename = case 
     when charindex(' ',reverse(rest))=2 
     then right(rest,charindex(' ',reverse(rest))-1) 
     else '' 
     end 
    , name 
from (
    select 
     Lastname = left(name, charindex(',',name+',')-1) 
    , rest  = ltrim(rtrim(stuff(name, 1,charindex(',',name+','),''))) 
    , name 
    from t 
) as s 

回報:

+-------------+----------+------------+----------------------+ 
| Firstname | Lastname | Middlename |   name   | 
+-------------+----------+------------+----------------------+ 
| JAN MARIE | WILLEMS | J   | WILLEMS, JAN MARIE J | 
| PATRICIA | HLAVACEK | K   | HLAVACEK, PATRICIA K | 
| CHRISTOPHER | KLIMEK |   | KLIMEK, CHRISTOPHER | 
| JAN MARIE | WILLEMS |   | WILLEMS, JAN MARIE | 
+-------------+----------+------------+----------------------+ 
+0

感謝一噸。這確實解決了我的問題! – chits

+0

@chits樂意幫忙! – SqlZim

相關問題