マスター データのステージング レイヤーを構築しており、次の状況と現在の解決策があります。私のトランザクション データには、マスター データ ID または「コード」しかなく、テキストによる説明はありません。ほとんどすべてのテキスト記述は、考えられるすべての「コード」とそれに続くテキスト値を含む単一の汎用テーブルで配信されます。このデータをステージング レイヤーに移動するには、元のフィールド長に基づいて、VARCHAR(60) のコードを実際のフィールド長にトリミングする必要があります。
つまり、マスター データ コードはソース環境から移動され、この Landing 環境に正しくキャストされ、VARCHAR(60) に埋め込まれます。ステージングに移行するときに、フィールドの長さに応じてトリミングする必要があります。
次の SQL を使用していますが、CASE ロジックでラップして、表示されるさまざまなフィールド長を管理しています。したがって、私が扱うさまざまな MD コードごとに、このビットのロジックを再現する必要があります。これを微調整して、すべてのフィールド長を 1 ビットのロジックで処理できるようにする方法を探しています。
SELECT ATTR_NM
, CASE
WHEN ATTR_NM = 'DOC_TYP'
THEN(
CASE WHEN CHARACTER_LENGTH (TRIM(BOTH FROM tx.MSTR_DATA_ATTR_CD)) > 1
THEN SUBSTRING( tx.MSTR_DATA_ATTR_CD FROM CHARACTER_LENGTH(TRIM(BOTH FROM tx.MSTR_DATA_ATTR_CD))-1)
ELSE tx.MSTR_DATA_ATTR_CD
END
)
WHEN SAP_ATTR_NM = 'ACCT_GRP'
THEN(
CASE WHEN CHARACTER_LENGTH (TRIM(BOTH FROM tx.MSTR_DATA_ATTR_CD)) > 4
THEN SUBSTRING( tx.MSTR_DATA_ATTR_CD FROM CHARACTER_LENGTH(TRIM(BOTH FROM tx.MSTR_DATA_ATTR_CD))-2)
ELSE tx.MSTR_DATA_ATTR_CD
END
)
END AS MSTR_DATA_ATTR_CD
, LANG_ISO_CD AS LANG_ISO_CODE
, tx.LANG AS LANG
, tx.END_DT AS END_DT
, tx.FRM_DT AS FRM_DT
FROM MASTER_DATA_DESC_BASE_VOL tx;
先頭に 0 があるコードを使用できるため、先頭の 0 を単にトリムすることはできません。フィールドの長さを知り、Trim 関数呼び出しでその数値を適用する必要があります。または、誰かが全体的により良い方法を持っています。私はプログラマー コンサルタントとして長年働いていますが、Teradata については少しばかりです。
また、これは機能しており、現在 20 を超えるさまざまなケースを処理しており、かなり効率的に実行されています。必要なことを行うためのより良い方法があることを知っているだけで、さらに多くのケースを追加し続ける必要があります。