0
select rtrim(char(PKG_AGR_IDR)),rtrim(char(STA_DTE)) 
from test FETCH FIRST 10 ROW ONLY


"0010000010. 2014-03-14"
"0010000010. 2014-03-14"

以下のようなデータが必要です。

0010000010 2014-03-14

rtrim(char(fieldname)) を実行するスクリプトを作成する予定です。両方のフィールドに対して適切な出力を取得できる関数の組み合わせはありますか。

4

2 に答える 2

1

シナリオをより適切に説明するために、OP は次のように書かれている可能性があると推測できます。

何が行われているかについての背景が含まれ、[field_name などへの] 後の参照は、レビュアーが直感的に理解する必要はなく、事前に説明されます。

その意図は、指定された TABLE の列からデータの文字表現を取得する SQL SELECT ステートメントを動的に生成できるようにすることです。DDLcreate table THE_SCHEMA.TEST ( PKG_AGR_IDR NUMERIC(10, 0), STA_DTE DATE )と、その TABLE に sample-row を設定するために使用される次の DML を考えるとinsert into THE_SCHEMA.TEST VALUES(10000010. '2014-03-14')、各列のデータを含む結果セット [テスト目的で最初の 10 行に制限] を取得することが望まれます。 [THE_SCHEMA の TEST という名前のテーブルの] SYSCOLUMNS カタログ VIEW に格納されたメタデータから生成された次のクエリから生成される VARCHAR データとして:
select rtrim(char(PKG_AGR_IDR)),rtrim(char(STA_DTE))
from test
FETCH FIRST 10 ROW ONLY

SYSCOLUMNS データから生成された単一の式は'RTRIM(CHAR(' CONCAT COLUMN_NAME CONCAT '))'、前述のクエリで 2 回見られるように、その文字式によってフォーマットされている COLUMN_NAME の DATA_TYPE の値に関係なく、列名に適用されたときに望ましい結果を提供できないようです。具体的には、たとえば、動的に生成されたクエリの結果はselect RTRIM(CHAR(PKG_AGR_IDR)), RTRIM(CHAR(STA_DTE)) from THE_SCHEMA.TEST FETCH FIRST 10 ROW ONLY、次の出力を生成します。

0010000010. 2014-03-14

ただし、予想される\望ましい出力は次のようになります。

0010000010 2014-03-14

RTRIM(CHAR(column_name)) のような、TABLE 内のすべての列に対して機能し、列のデータ型に関係なく、文字列としてデータを取得する式はありますか?

それでも、シナリオ\背景のより完全な説明があっても:

元の式からの出力が何であるかについての主張は、10 進数から文字へのキャストに影響する CHAR スカラーからは予想外です。少なくとも、ゼロスケールのパック 10 進数 (DECIMAL) およびゾーン 10 進数 (NUMERIC) の SQL データを使用する DB2 for i SQL では、2 番目の引数としてオプションのdecimal-characterが指定されているにもかかわらず、型は小数点記号 [aka decimal point]なしで表されます。同様に、CHAR スカラーは、数値からキャストするときに先頭のゼロを省略します。したがって、DB2 for i SQL は、 または のいずれかではなく、文字列の結果を取得します。'10000010''0010000010.''10000010.'

この問題は DB2 for Z または DB2 LUW に固有のものである可能性があり、おそらくこのトピックは DB2 for i で誤ってタグ付けされたのではないでしょうか? あるいは、DB2 バリアント間に明らかな非互換性があるという懸念があるのではないでしょうか? それでも、ドキュメントを読んだところ、説明されている結果はドキュメントに反しているように見えるため、OP の実際の問題は、[DB2 の宣言されていないバリアントと使用されているリリース レベルが何であれ] 欠陥に遭遇したことが原因である可能性があると思われます。 ].?

NUMERIC、VARCHAR、および DATE のそれぞれに対して [または INTEGER、SMALLINT、NUMERIC、DECIMAL、VARCHAR、および DATE のそれぞれに対して] 求められることを実行する式が 1 つも存在しないとは思いません。小数点の省略については、DB2 for i SQL がおそらく希望どおりに表現されているものに最も似ていますが、先頭のゼロは常に削除されます http://www.ibm.com/support/knowledgecenter/ssw_ibm_i_72/db2/rbafzscachar .htm

... 先行ゼロは返されません。末尾のゼロが返されます。decimal-expression の位取りがゼロの場合、小数点文字は返されません。...

DB2 LUW SQL は、例 6が何も示唆していないことを示唆しており、例 7がそれらがあることを示しているため、先頭のゼロのトピックに関しては少なくともいくぶん一貫性がないように見えますが、上記のドキュメント参照のように、明らかに先頭のゼロ文字があってはなりませんhttp:/ /www.ibm.com/support/knowledgecenter/SSEPGG_10.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0000777.html

... 先行ゼロは含まれません。末尾のゼロが含まれます。... decimal-expression の位取りがゼロの場合、小数点文字は返されません。...

DB2 for Z のドキュメント リンクを調査しませんでした。

おそらく DATA_TYPE 値に対して、CASE 式を使用するソリューションが必要になると思います。VARCHAR キャスト スカラーを使用しただけで、トリミングは一切行いませんでしたが、これは私が似たようなコーディングを行ったことです。ただし、CASE に対する私の要件は、先頭のゼロ文字を保持することではなく、主に正しい小数点区切り文字を選択することでした。また、2 番目の引数decimal-character [CHAR または VARCHAR の場合] はINTEGERCASE WHEN DATA_TYPE IN ('INTEGER', 'SMALLINT', 'BIGINT') THEN ', ' concat DecSep concat ')' ELSE ')'数値型 [sqlcode -171 aka SQL0171] では許可されないため、数値型のみの CASE 式は、次の式を追加するだけで十分に解決されます。'VARCHAR(' concatここで、DecSep は、選択した小数点記号としてコンマまたはピリオドを持つ 1 文字の変数です。ただし、2 番目の引数 [CHAR または VARCHAR の場合] は最初の引数のデータ型に固有であるため、文字および日付/時刻のデータ型には独自の CASE 式CASE WHEN DATA_TYPE IN ('DATE', 'TIME') THEN ', ' concat StdFmt concat ')' ELSE ')'が追加されました'VARCHAR(' concat。StdFmt は、次のいずれかを持つ 3 文字の変数です。ISO、USA、EUR、または JIS の標準フォーマット仕様。

于 2015-04-30T18:01:54.700 に答える