我很难解决这个看似简单的任务:
目的: 创建一个消除中间初始
的查询实施例
Name
Smith, John A
Jane, Mary S
我想输出如下:
Name
Smith, John
Jane, Mary
有关如何使用Teradata SQL执行此操作的任何提示
我相信我解决了这个问题,虽然方式非常糟糕:
SELECT SUBSTR('SMITH, JOHN A', 0, (POSITION(' ' IN 'SMITH, JOHN A') + (POSITION(' ' IN SUBSTR('SMITH, JOHN A',(POSITION(' ' IN 'SMITH, JOHN A'))+ 1,50)))))
答案 0 :(得分:1)
select a,
substr(a,1,index(a,' '))|| substr(trim(substr(a,index(a,' '))),1,index(trim(substr(a,index(a,' '))),' ')),
substr(trim(substr(a,index(a,' '))),index(trim(substr(a,index(a,' '))),' ')) last_name
from a
答案 1 :(得分:0)
挑战在于确保您的名字始终格式化。 (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)
)
如果格式不一致,那么我们必须查看其他不太优雅的选项。
希望这有帮助。