Sql Teradata字符串操作(第二个空格)
我很难解决这个看似简单的任务: 目的: 创建一个删除中间首字母的查询 范例Sql Teradata字符串操作(第二个空格),sql,string,teradata,Sql,String,Teradata,我很难解决这个看似简单的任务: 目的: 创建一个删除中间首字母的查询 范例 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 SUB
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)))))
挑战在于确保您的姓名格式一致。Last_Name,gived_Name Middle_Initial如果是,那么您可以使用递归SQL解决这个问题。下面的SQL将采用给定的姓氏并返回姓氏。你可以调整它来完成你的特定任务。我的示例数据格式不一致,因此我一直在尝试查找第二个或第三个出现的空白字符
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个字符。e、 g.RIGHTFullName,n
如果格式不一致,那么我们必须考虑其他不太优雅的选项
希望这有帮助
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