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ソリューションよりも優先されます
番号が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
を使用します。
select to_char(x,'00000') from dual;
本当にこれらの数値を前にゼロを付けて格納したい場合は、データ型をvarchar2に変更する必要があります。次に、updateステートメントでto_char( artnr , 'fm00009')
を適用できます。もちろん、これは意図しない結果をもたらす可能性があります。ご自身の責任でこのソリューションを選択してください。
また、そのビューから選択するときに、「オンザフライ」で数字をゼロパディングするビューを作成することも検討してください。
私の場合、目標はさまざまな通貨の値の合計を計算することでしたが、問題は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;