Teradata String Manipulation(第二空间)

时间:2011-10-18 12:22:41

标签: 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 SUBSTR('SMITH, JOHN A',(POSITION(' ' IN 'SMITH, JOHN A'))+ 1,50)))))

2 个答案:

答案 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)

如果格式不一致,那么我们必须查看其他不太优雅的选项。

希望这有帮助。