2016-09-05 24 views
3

oracle sql関数to_charを使用して書式設定しようとしている数値列の表があります。列がどのように表示されるかに応じて、結果は空白になるかどうかを取得します。私は両方のケースで同じ結果を期待されるだろうoracle sqlのTO_CHAR関数が場合によっては末尾の空白を追加しています

[;000000000749460366 ;];[000000000749460366] 
[;000000008751094792 ;];[000000008751094792] 
[;000000000000050696 ;];[000000000000050696] 
[;000000000000000000 ;];[000000000000000000] 

が、差がある理由を私は理解できません。

SELECT 
    '[',TO_CHAR(ABS(Balance), 'FM0000000000000000V00'),']', 
    '[' || TO_CHAR(ABS(Balance),'FM0000000000000000V00') || ']' 
FROM Accounts 

は私に次のような結果を取得します。これらの違いがある理由はありますか?

多くのおかげで、 ピエール・イヴ・

答えて

5

の値にに後続のスペースが追加されていません。長さを確認しても18のままであれば、連結されたバージョンにもスペースがあります。 、17桁の値が供給される形式で表示することができない

set colsep ; 
with accounts(balance) as (
    select 749460366 from dual 
    union all select 123456789from dual 
    union all select 123456789from dual 
) 
SELECT 
    '[',TO_CHAR(ABS(Balance), 'FM0000000000000000V00') as balance,']', 
    '[',length(TO_CHAR(Balance, 'FM0000000000000000V00')) as length,']', 
    '[' || TO_CHAR(ABS(Balance),'FM0000000000000000V00') || ']' 
FROM Accounts; 

';BALANCE   ;';'; LENGTH;';'['||TO_CHAR(ABS(BALA 
-;-------------------;-;-;----------;-;--------------------- 
[;000000074946036600 ;];[;  18;];[000000074946036600] 
[;123456789;];[;  18;];[123456789] 
[;###################;];[;  19;];[###################] 

:列のメタデータが最大長を決定された元のバランス値が16桁を超える場合に真であると思われる、19でありますハッシュを代用します。興味深いことにそれらのうちの19、実際バランス値が大きいです。

FM修飾子は、正の値の先頭のスペースを抑制します。負の16桁の値がある場合は、マイナス記号が表示されるので、それを表示するためにはまだ19桁の数字が必要です。 ABS()コールのために値が負ではないことがわかっていますが、TO_CHAR()関数はそのことを知らないため、列幅にマイナス記号を使用する必要があります。

実際にアプリケーションからクエリ/コンバージョンを実行している場合(例: JDBCを使用すると、戻った文字列(ABS()の後に17桁未満)は18文字になり、(存在しない)末尾のスペースはありません。

クライアント(または少なくともSQL * PlusおよびSQL Developer)は、できるだけ広いと考えられる内容に基づいて列幅を書式設定しています。あなたはそれを上書きすることができます:消え非スペースになりますが、台無し

column balance format A18 

with accounts(balance) as (
    select 749460366 from dual 
    union all select 123456789from dual 
    union all select 123456789from dual 
    union all select 123456789from dual 
) 
SELECT 
    '[',TO_CHAR(ABS(Balance), 'FM0000000000000000V00') as balance,']', 
    '[',length(TO_CHAR(Balance, 'FM0000000000000000V00')) as length,']', 
    '[' || TO_CHAR(ABS(Balance),'FM0000000000000000V00') || ']' 
FROM Accounts; 

';BALANCE   ;';'; LENGTH;';'['||TO_CHAR(ABS(BALA 
-;------------------;-;-;----------;-;--------------------- 
[;000000074946036600;];[;  18;];[000000074946036600] 
[;123456789;];[;  18;];[123456789] 
[;##################;];[;  19;];[###################] 
;#     ; ; ;   ; ;      

[;##################;];[;  19;];[###################] 
;#     ; ; ;   ; ;      

...さらに/場合、それは次の行に余分なハッシュを包むように、元の値が16桁を超えた場合。

また、明示的にあなたが期待する長さに結果をキャストすることができます:

clear columns 

with accounts(balance) as (
    select 749460366 from dual 
    union all select 123456789from dual 
    union all select 123456789from dual 
    union all select 123456789from dual 
) 
SELECT 
    '[',CAST(TO_CHAR(ABS(Balance), 'FM0000000000000000V00') as varchar2(18)) as balance,']', 
    '[',length(TO_CHAR(Balance, 'FM0000000000000000V00')) as length,']', 
    '[' || TO_CHAR(ABS(Balance),'FM0000000000000000V00') || ']' 
FROM Accounts; 

';BALANCE   ;';'; LENGTH;';'['||TO_CHAR(ABS(BALA 
-;------------------;-;-;----------;-;--------------------- 
[;000000074946036600;];[;  18;];[000000074946036600] 
[;123456789;];[;  18;];[123456789] 
[;##################;];[;  19;];[###################] 
[;##################;];[;  19;];[###################] 
0
SELECT 
    '[', lpad(ABS(Balance),18,0) ,']', 
    '[' || lpad(ABS(Balance),18,0) || ']' 
FROM Accounts 

これは私と同じ結果を示しています。

関連する問題