을 도전은 확실히 당신의 이름은 지속적으로 포맷하고있다. (Last_Name, Given_Name Middle_Initial
) 그렇다면 재귀 적 SQL을 사용하여이 문제를 해결할 수 있습니다. 다음 SQL은 Given_Name Last_Name
을 취하고 Last_Name
을 리턴합니다. 특정 작업을 수행하기 위해이를 조정할 수 있습니다. (내 샘플 데이터가 지속적으로 나는 공백 문자의) 두 번째 (또는 세 번째 발생을 찾기 위해 노력하고 붙어 그래서 포맷되지 않았습니다.)
WITH RECURSIVE cte (FullName, DelimPosition, RecursionLevel, Element, Remainder) AS
(
SELECT FullName
, 0 AS DelimPosition_
, 0
, CAST('' AS VARCHAR(128))
, FullName
FROM MyDatabase.Persons
UNION ALL
SELECT FullName
, CASE WHEN POSITION(' ' IN Remainder) > 0
THEN POSITION(' ' IN Remainder)
ELSE CHARACTER_LENGTH(Remainder)
END DelimPosition_
, RecursionLevel + 1
, SUBSTRING(Remainder FROM 0 FOR DelimPosition_ + 1)
, SUBSTRING(Remainder FROM DelimPosition_ + 1)
FROM cte
WHERE DelimPosition_ > 1
AND RecursionLevel < 3 -- Set max depth
)
SELECT FullName
, CASE WHEN POSITION('&' IN Element) = 0
THEN Element
ELSE NULL
END AS LastName
FROM cte c
WHERE RecursionLevel > 2
ORDER BY FullName;
는 또 다른 옵션은 오른쪽 N을 반환하는 UDF를 구현하는 것 문자열의 문자. (예 : RIGHT(FullName, n)
)
형식이 일치하지 않으면 덜 비싼 다른 옵션을 살펴 봐야합니다.
희망이 도움이됩니다.