Как отобразить ведущие нули в ряду оракула

У меня есть столбец оракула (artnr) имеет длину 1, которая имеет номер типа (9). Я хочу обновить номер следующим образом...

Пример :

Если число равно 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


person Ramu Pedada    schedule 22.09.2014    source источник
comment
В числе не может быть ведущих нулей, это символ, поэтому удалите TO_NUMBER() вокруг последнего утверждения.   -  person Ben    schedule 22.09.2014
comment
Когда столбец имеет тип данных number, ведущие нули не сохраняются. Сохраняйте значения в виде чисел и используйте либо lpad() (используйте to_char(), чтобы избежать неявного преобразования типа данных), либо to_char() напрямую при отображении данных.   -  person Nick Krasnov    schedule 22.09.2014


Ответы (3)


Если число равно 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

Чтобы избежать неявного преобразования типа данных, используйте TO_CHAR перед применением LPAD.

person Lalit Kumar B    schedule 22.09.2014

Если вы действительно хотите хранить эти числа с предшествующими нулями, вы должны изменить тип данных на varchar2. Затем вы можете применить to_char( artnr , 'fm00009') в операторе обновления. Конечно, это может привести к непредвиденным последствиям. Используйте это решение на свой страх и риск.

Вы также можете подумать о создании представления, которое дополняет число нулями «на лету», когда вы выбираете из этого представления.

person René Nyffenegger    schedule 22.09.2014

В моем случае целью было вычислить сумму значений разных валют, но проблема была создана типом данных поля VALUE, то есть VARCHAR2 (255 BYTE). Я нашел это решение для решения проблемы начального нуля:

    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;
person cosgiu83    schedule 18.05.2017