0

我很难解决这个看似简单的任务:

目的:创建一个消除中间名首字母的查询

例子

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)))))
4

2 回答 2

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
于 2012-02-22T13:16:47.930 回答
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;

另一种选择是实现一个返回字符串最右边n 个字符的 UDF。(例如RIGHT(FullName, n)

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

希望这可以帮助。

于 2011-10-18T13:56:28.513 回答