Как разобрать имя, фамилию и отчество из этого полного имени - PullRequest
0 голосов
/ 25 октября 2019

Как разобрать имя, фамилию и отчество из этого полного имени

Пример

 Fullname 
 ------------------
 Jose,KENNETH;N

Ответы [ 3 ]

0 голосов
/ 25 октября 2019

Надеюсь, это поможет вам !!!

DECLARE @string VARCHAR(1000) = 'Jose,KENNETH;N'       
select @string AS FullName, substring(@string,1,CHARINDEX(',',@string)-1) as LastName,
SUBSTRING(@string,charindex(',',@string)+1,len(@string)-Charindex(',',@string)-charindex(';',REVERSE(@string))) as FirstName,
SUBSTRING(@string,Charindex(';',@string)+1,len(@string)) as MiddleName
0 голосов
/ 25 октября 2019

Если ваше имя всегда содержит три части, и ни одна из них не длиннее 128 символов, и ни одна из них не содержит точку, вы можете (ab) использовать parsename:

DECLARE @string VARCHAR(1000) = 'Jose,KENNETH;N'

SELECT  PARSENAME(fullName, 1) As MiddleName,
        PARSENAME(fullName, 2) As FirstName,
        PARSENAME(fullName, 3) As LastName
FROM (VALUES(REPLACE(REPLACE(@string, ';', '.'), ',', '.'))) V(fullName)

Результаты:

MiddleName  FirstName   LastName
N           KENNETH     Jose
0 голосов
/ 25 октября 2019

APPLY ваш друг.

Запрос:

DECLARE @string VARCHAR(1000) = 'Jose,KENNETH;N'

SELECT 
  FullName  = @string,
  FirstName = SUBSTRING(@string,0,a.pos),
  LastName  = SUBSTRING(@string,a.pos+1,b.pos-a.pos-1),
  Middle    = SUBSTRING(@string,b.pos+1,8000)
FROM        (VALUES(CHARINDEX(',',@string)))       AS a(pos)
CROSS APPLY (VALUES(CHARINDEX(';',@string,a.pos))) AS b(pos);

Результаты:

FullName           FirstName  LastName  Middle
------------------ ---------- --------- --------
Jose,KENNETH;N     Jose       KENNETH   N

ОБНОВЛЕНО ПО ОТЗЫВУ ОП

Без использования APPLY:

SELECT 
  FullName  = @string,
  FirstName = SUBSTRING(@string,0,CHARINDEX(',',@string)),
  LastName  = SUBSTRING(@string,CHARINDEX(',',@string)+1,CHARINDEX(';',@string,CHARINDEX(',',@string))-CHARINDEX(',',@string)-1),
  Middle    = SUBSTRING(@string,CHARINDEX(';',@string,CHARINDEX(',',@string))+1,8000);
...