2011-10-18 17 views
0

我有很大的困難解決這個看似簡單的任務:Teradata的字符串操作(第二空間)

目的: 創建,消除了中間的初始

實例查詢

Name 
Smith, John A 
Jane, Mary S 

我想要這樣的輸出:

關於如何使用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

所面臨的挑戰是,確保你的名字是一致的格式。 (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 A UDF字符串的字符。 (例如RIGHT(FullName, n)

如果格式不一致,那麼我們不得不查看其他較不優雅的選項。

希望這會有所幫助。

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