私はTeradataで作業しており、データ要素のタイプと属性値に基づいて、gerneric varchar(60)からさまざまなフィールド長に変換する必要のある記述データを使用しています。したがって、Varchar(60)にあるものをすべて取得し、フィールド「ABCD」に基づいてフィールド「XYZ」に作用する必要があります。この場合、XYZはvarchar(3)です。これを行うために、select内でCASEロジックを使用しています。私がやりたいのは
アルファベット/数値以外のデータの出現をすべて排除します。残したいのは大文字のアルファ文字と数字だけです。この場合、「abcd ='GROUP'の場合、xyzは '000'、 '002'、'A'、'C'として出力されるはずです。余分なパディングを排除します。すべてを右にシフトします。
abcd xyz
1 GROUP NULL
2 GROUP $
3 GROUP 000000000000000000000000000000000000000000000000000000000000
4 GROUP 000000000000000000000000000000000000000000000000000000000002
5 GROUP A
6 GROUP C
7 GROUP r
これを行うために、動作しなかった他のいくつかの中でTRIMとSUBSTRを試しました。現在作業しているものを貼り付けましたが、select内のデータを確実に処理していません。私は、Teradataで文字列をより適切に処理する方法に関するいくつかのオプションを本当に探しています。私は「SQL関数、演算子、式、および述語」オンラインPDFを作成してきました。より良いリファレンスはありますか?私たちはTD13にいます
SELECT abcd
, CASE
-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
WHEN abcd= 'GROUP'
THEN(
CASE
WHEN SUBSTR(tx.abcd,60, 4) = 0
THEN (
SUBSTR(tx.abcd,60, 3)
)
ELSE
TRIM (TRAILING FROM tx.abcd)
END
)
END AS abcd
FROM db.descr tx
WHERE tx.abcd IS IN ( 'GROUP')
最終結果は次のようになります
abcd xyz
1 GROUP 000
2 GROUP 002
3 GROUP A
4 GROUP C
約60種類の「abcd」タイプを処理する必要がありますが、それらはすべて、現在表示しているデータのタイプに準拠している必要があります。つまり、大文字と小文字の混合、数値以外、アルファベット以外、パディングなどです。
より良い方法があることは知っていますが、週末にこれを理解しようといくつかのサークルに参加し、正しい方向に少し押す必要があります。
よろしくお願いします、パット