Задача состоит в том, чтобы убедиться, что ваши имена последовательно отформатированы. (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;
Другой вариант - реализовать UDF, который возвращает самые правые n символов строки. (Например, RIGHT(FullName, n)
) * +1010 *
Если форматирование не соответствует, тогда мы должны рассмотреть другие менее изящные варианты.
Надеюсь, это поможет.