2

私は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」タイプを処理する必要がありますが、それらはすべて、現在表示しているデータのタイプに準拠している必要があります。つまり、大文字と小文字の混合、数値以外、アルファベット以外、パディングなどです。

より良い方法があることは知っていますが、週末にこれを理解しようといくつかのサークルに参加し、正しい方向に少し押す必要があります。

よろしくお願いします、パット

4

1 に答える 1

4

以下のSQLは、CHARACTER_LENGTH関数を使用して、Teradata 13.xのネイティブ関数を使用してRIGHT(tx.xyz、3)に相当するものを実行する必要があるかどうかを最初に判断します。これはあなたがやろうとしていることを達成するかもしれないと思います。私はあなたの説明を誤解していないことを願っています:

SELECT CASE WHEN tx.abcd = 'GROUP'
             AND CHARACTER_LENGTH(TRIM(BOTH FROM tx.xyz) > 3
            THEN SUBSTRING(tx.xyz FROM (CHARACTER_LENGTH(TRIM(BOTH FROM tx.xyz)) - 3))
            ELSE tx.abcd
       END
FROM db.descr tx;

編集: SUBSTRINGの括弧を修正しました

于 2012-09-17T16:32:48.950 に答える