の値にに後続のスペースが追加されていません。長さを確認しても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;];[###################]
を