2011-10-18 12 views
0

私は大きな困難この一見簡単な作業で解決することだ:Teradataの文字列操作(第二の空間)

目的: を私は真ん中の初期

Name 
Smith, John A 
Jane, Mary S 

を排除し、クエリを作成します。次のような出力を希望します。

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

挑戦はあなたの名前が一貫してフォーマットされていることを確認作っている:0のTeradata SQL

でこれを行う方法上の任意のヒントは、私は非常に悪い方法ではあるが、問題を解決したと考えています。 (Last_Name, Given_Name Middle_Initial)そうであれば、再帰SQLでこれを解決できるかもしれません。次のSQLはGiven_Name Last_Nameをとり、Last_Nameを返します。あなたはあなたの特定の仕事を達成するためにそれを微調整することができるかもしれません。 (私はホワイトスペース文字の2(または第3)の発生を見つけようとして貼り付けたので、私のサンプルデータが一貫してフォーマットされていませんでした。)

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)

フォーマットが一貫していない場合は、それ以外の優雅なオプションを検討する必要があります。

これが役に立ちます。

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