web-dev-qa-db-ja.com

db2クエリで10進数から文字に変換するときに先行ゼロが取得されるのはなぜですか?

次のように定義された長さという名前の列があります。

TYPE_NAME: DECIMAL 
DATA_TYPE: 3 
COLUMN_SIZE: 9 
BUFFER_LENGTH: 11
DECIMAL_DIGITS: 5 
NUM_PREC_RADIX: 10

次の選択を実行すると:

select char(length) st_length, length from atable

St_length列に先行ゼロが表示されます。

st_length   length
0043.00000  43.00000
0043.00000  43.00000
0045.00000  45.00000
0044.00000  44.00000
0044.00000  44.00000
0046.00000  46.00000

先頭のゼロを取得する理由と、それらを取り除く方法を教えてください。


編集:私はこれを先に言うつもりでしたが、忘れていました。私はdb2 v9.5.8 LUWを使用しています。


解決:私の元の目標は、長さの左端の文字を取得することでした。私はこれで終わりました:

select left(char(cast(length as int)),1) st_length, length from atable 

その結果、

st_length  length
4          43.00000
4          43.00000
4          45.00000
4          44.00000
4          44.00000
4          46.00000

改善は大歓迎です。

5
DMKing

仕様により表示されます。詳細については、v9.7の 動作の変更 を参照してください。

[〜#〜] varchar [〜#〜] の内側に [〜#〜] lpad [〜#〜] が必要です。

3
gbn

私の状況では、CASEステートメントを使用してこの問題を解決できました。 _APPLICATION_OID_はDECIMAL(17,0)です。必要に応じて、ケースステートメントの範囲を調整する必要があります。

_SELECT LENGTH(CHAR(APPLICATION_OID)), APPLICATION_OID, CHAR(APPLICATION_OID), 
CASE WHEN APPLICATION_OID > 0 AND APPLICATION_OID <= 9 THEN SUBSTR(CHAR(APPLICATION_OID),18,1)
     WHEN APPLICATION_OID > 9 AND APPLICATION_OID <= 99 THEN SUBSTR(CHAR(APPLICATION_OID),17,2)
     WHEN APPLICATION_OID > 99 AND APPLICATION_OID <= 999 THEN SUBSTR(CHAR(APPLICATION_OID),16,3)
END
FROM ABCDEFG.APP_MSTR
WHERE APPLICATION_OID IN (57,1,2,3,4,5,6,7,8,9,10)
WITH UR;
_
2
BPB