2017-03-09 1 views
1

성, 이름 및 중간 이름으로 나눌 fullname이 있습니다. 다음은 예제 이름입니다. SQL에서 주어진 문자열에서 서브 문자열을 추출하는 방법

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

지금 내 이름, 중간 이름 및 LASTNAME 내가 아래 쿼리를 시도

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

관련 문제