0

さまざまな長さのフィールドがあり、スキーマで定義されたフィールド長までスペースを右に埋め込みたいと考えています。

次のステートメントが機能しています。

SELECT RPAD(field, LENGTH(field), ' ') AS field FROM schema.table;

これにより、SQLState 42703 で SQL エラー 206 が生成されます。使用されているコンテキストでは無効です。

// Our application resolves the prepared statement's ? - this is working fine
INSERT INTO schema.table (field) VALUES (RPAD(?, LENGTH(field), ' '));

同じことが次の場合にも起こります。

INSERT INTO schema.table (field) VALUES (RPAD(?, LENGTH(schema.table.field), ' '));

フィールド長のハードコーディングを回避する可能性はありますか?

4

2 に答える 2

2

固定長のカラムが必要な場合、なぜ使用しているのVARCHARですか?使用CHAR-DB2は自動的に値をパディングします。

于 2012-09-20T17:08:29.157 に答える
2

あなたの問題は、スカラー関数が行を操作することです。LENGTH(field)select ステートメントなど、行を返すステートメント内でのみ機能します。理由を理解するために、 の代わりに他の関数を配置することを想像してくださいLENGTH()LCASE(field)たとえば、特定の行の文字列の小文字を取ります。列に一般的に適用しても意味がありません。LENGTH()場合によっては、行ごとに異なる場合もあります。列の型が の場合、実際の文字列の長さを返しますVARCHARLENGTH()

解決策は、任意の行を選択LENGTH()し、フィールドで操作を実行し、結果を変数に格納することです。

CREATE OR REPLACE VARIABLE field_length INTEGER;
SET field_length = (
    SELECT LENGTH(field) FROM schema.table 
        WHERE field IS NOT NULL
        FETCH FIRST ROW ONLY
);

これは、コード内で 1 回だけ行う必要があります。次に、長さを使用する必要があるときはいつでも:

INSERT INTO schema.table (field) VALUES (RPAD(?, field_length, ' '));

この解決策は、ではなくfieldとして定義されていることに依存することに注意してください。でこれを行う必要がある場合は、システム テーブルからフィールドの長さを調べることができます。CHAR(x)VARCHAR(x)VARCHARsyscat.columns

編集:LENGTH()の値が null の場合に null を返す可能性があるため、null 値の処理を追加しましfieldた。

于 2012-09-20T11:13:10.580 に答える