web-dev-qa-db-ja.com

多くのオラクルで先行ゼロを表示する方法

Oracle列(artnr)にタイプnumber(9)の長さ1が含まれています。次のように番号を更新したい...

例:

番号が0の場合は00000になります。番号が1の場合は00001になります。番号が12の場合は00012になります。

覚えておいてください:ここでは、00000,0000と00012は数値データ型です

以下は私が試したが失敗した方法です。

UPDATE pitb.toestel b
   SET b.artnr = LPAD (b.artnr, 5, 0)
 WHERE b.idinventaris = 403743;

Lpadは文字列にのみ適用できるため、失敗しました

UPDATE pitb.toestel b
   SET b.artnr = TO_NUMBER (TO_CHAR (artnr, '00009'), '00009')
 WHERE b.idinventaris = 403743;

To_numberは先行ゼロを表示しないため、まだ失敗しています。最初の番号からのみ考慮されます

誰か、このシナリオを解決する何かを私に提案していただけませんか。

sqlはpl/sqlソリューションよりも優先されます

5
Ramu Pedada

番号が0の場合は00000になります。番号が1の場合は00001になります。番号が12の場合は00012になります。

覚えておいてください:ここでは、00000,0000と00012は数値データ型です

まず、数字の先頭にゼロはありません。したがって、NUMBER値を格納するときは、それらをNUMBERのように動作させます。それらを表示したい場合にのみ、LPADを使用して先行ゼロを追加できます。これは、数値を先行ゼロの文字列に変換します。

したがって、テーブルを更新する必要はありません。 LPADを使用して、希望どおりに表示します。

 SQL> WITH DATA AS
  2    ( SELECT 1 ID FROM DUAL UNION ALL
  3      SELECT 11 ID FROM DUAL
  4    )
  5  SELECT
  6     LPAD(ID,5, 0) id
  7  FROM DATA
  8  /

ID
-----
00001
00011

暗黙的なデータ型変換を回避するには、LPADを適用する前にTO_CHARを使用します。

10
Lalit Kumar B
select to_char(x,'00000') from dual;
5

本当にこれらの数値を前にゼロを付けて格納したい場合は、データ型をvarchar2に変更する必要があります。次に、updateステートメントでto_char( artnr , 'fm00009')を適用できます。もちろん、これは意図しない結果をもたらす可能性があります。ご自身の責任でこのソリューションを選択してください。

また、そのビューから選択するときに、「オンザフライ」で数字をゼロパディングするビューを作成することも検討してください。

1

私の場合、目標はさまざまな通貨の値の合計を計算することでしたが、問題はVARCHAR2(255 BYTE)であるフィールドVALUEのデータ型によって作成されました。先行ゼロの問題を処理するために、この解決策を見つけました。

    SELECT ID_OUT
          , CASE WHEN REPLACE(SUM(REPLACE(VALUE, '.', ',')), ',', '.') LIKE '-.%' THEN REPLACE(REPLACE(SUM(REPLACE(VALUE, '.', ',')), ',', '.'), '-.', '-0.')
                 WHEN REPLACE(SUM(REPLACE(VALUE, '.', ',')), ',', '.') LIKE '.%' THEN REPLACE(REPLACE(SUM(REPLACE(VALUE, '.', ',')), ',', '.'), '.', '0.')
                 ELSE REPLACE(SUM(REPLACE(VALUE, '.', ',')), ',', '.') 
            END AS VALORE
         , LOB
         , 'TOTAL' CURRENCY
         , COUNTRY
    FROM QRT_OUT_DATI
    WHERE (CURRENCY != 'Total' AND CURRENCY != 'TOTAL')
    GROUP BY ID_OUT, LOB, COUNTRY, CURRENCY 
    ORDER BY LOB;
0
cosgiu83