挑战在于确保您的姓名格式一致。( 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)
)
如果格式不一致,那么我们必须查看其他不太优雅的选项。
希望这可以帮助。