私は大量のデータの定期的な (毎月の) インポートに取り組んでいます。変換中に、文字列を複数の列に分割していますが、単純な分割ではありません。文字列のどの部分がどのフィールドに入るかを決定するロジックが少しあります。
文字列を複数の部分に分割し、指定されたインデックスの値を提供するインライン関数を作成しました。
パラメータは次のとおりです。
- 文字列値
- デリミタ
- 索引
例えば:
文字列値がX4-728Z5-121-84gff
であり、関数で 121 を取得したい場合は、次のように関数を呼び出します。
fn_MyFunc('X4-728Z5-121-84gff', '-', 3)
私の問題はこれです:
私のインポート クエリでは、特定のフィールド値に必要なインデックスは、別のインデックスの値に依存しています。インデックス 1 の値 = の場合はX4
インデックス 3、それ以外の場合はインデックス 4 が必要です。
1 つのクエリで、いくつかの case ステートメントの結果に応じて、この関数を 4 回または 5 回呼び出します。
関数は基本的に同じことを何度も繰り返しています...しかし、毎回異なるインデックスを取得しています。文字列を分割するという大変な作業を 1 回だけ行い、同じクエリで異なるインデックスを簡単に取得できるようにするには、どうすれば労力を削減できますか?
これは外部ソースからのデータのインポート中であり、正規化やインデックス付きビューなどを示唆する回答は役に立たないことに注意してください。
編集
私は私の質問を投稿するように頼まれました:
SELECT
ComplexString,
CAST(fn_MyFunc(ComplexString, '-', 1) AS NVARCHAR(2)) AS LocationCode,
CAST(fn_MyFunc(ComplexString, '-', 2) AS NVARCHAR(25)) AS CompanyCode,
NULLIF(CASE
WHEN fn_MyFunc(ComplexString, '-', 1) = 'R1' THEN NULL
ELSE CAST(fn_MyFunc(ComplexString, '-', 3) AS INT)
END, 0) AS ManagementType,
CASE
WHEN fn_MyFunc(ComplexString, '-', 1) = 'R1' THEN CAST(fn_MyFunc(ComplexString, '-', 3) AS VARCHAR(25))
ELSE CAST(fn_MyFunc(ComplexString, '-', 4) AS NVARCHAR(25))
END AS Network,
.
.
.
FROM MyTable