sql >> データベース >  >> RDS >> Oracle

Oracle-数値をTO_CHARに変換すると、数値の先行ゼロが消えるのはなぜですか

    先頭または末尾のスペース、ピリオド、ゼロを使用せずに数値をフォーマットする方法を探していました(1未満の数値の先行ゼロを除く)。

    これは、このような最も一般的なフォーマットをOracleで簡単に実現できないことを苛立たせています。

    トム・カイトでさえ、このような長く複雑な回避策を提案しただけです:

    case when trunc(x)=x
        then to_char(x, 'FM999999999999999999')
        else to_char(x, 'FM999999999999999.99')
    end x
    

    しかし、私はその価値について一度だけ言及するより短い解決策を見つけることができました:

    rtrim(to_char(x, 'FM999999999999990.99'), '.')
    

    これは、すべての可能な値に対して期待どおりに機能します:

    select 
        to_char(num, 'FM99.99') wrong_leading_period,
        to_char(num, 'FM90.99') wrong_trailing_period,
        rtrim(to_char(num, 'FM90.99'), '.') correct
    from (
      select num from (select 0.25 c1, 0.1 c2, 1.2 c3, 13 c4, -70 c5 from dual)
      unpivot (num for dummy in (c1, c2, c3, c4, c5))
    ) sampledata;
    
        | WRONG_LEADING_PERIOD | WRONG_TRAILING_PERIOD | CORRECT |
        |----------------------|-----------------------|---------|
        |                  .25 |                  0.25 |    0.25 |
        |                   .1 |                   0.1 |     0.1 |
        |                  1.2 |                   1.2 |     1.2 |
        |                  13. |                   13. |      13 |
        |                 -70. |                  -70. |     -70 |
    

    まだもっと短い解決策を探しています。

    カスタムヘルパー機能を備えた短縮アプローチがあります:

    create or replace function str(num in number) return varchar2
    as
    begin
        return rtrim(to_char(num, 'FM999999999999990.99'), '.');
    end;
    

    ただし、カスタムのpl / sql関数にはパフォーマンスのオーバーヘッドが大きく、重いクエリには適していません。



    1. SQLServerの「Waitforでクエリは許可されていません」エラー101

    2. オラクルで2つの日付を減算して、時間と分で結果を取得する方法

    3. SQL Serverエラー4104:マルチパート識別子をバインドできませんでした。

    4. データベースを圧縮して実行速度を上げる方法