Обрезать начальные нули, если он числовой, и не обрезать нули, если буквенно-цифровой

В столбце есть числовые и буквенно-цифровые значения, начинающиеся с "0". Как обрезать начальные нули, если он числовой, и не следует обрезать нули, если он является буквенно-цифровым в Oracle.

Мне нужно использовать его в ГДЕ состоянии.

Ex.

000012345 должно быть 12345.012321 должно быть 12321.00012JY12 должно быть 00012JY12.

Вот что я попробовал:

    SELECT COUNT(*)
    FROM <TABLE 1> ONN, <TABLE 2> SV
   WHERE SV.CSA_SHP_VISIT_STG_SEQ_ID=ONN.CSA_SHOP_VIST_SEQ_ID
    AND EXISTS (SELECT '1' FROM  <TABLE 3> TMP 
    WHERE TRIM(SV.WORK_ORDER_NUM) = TRIM(TMP.WORK_ORDER_NUM)
    AND PLANT IN ('EMA')
    AND regexp_replace(TRIM(ONN.INSTLD_PART), '^0+([[:digit:]]+)$', 
   '\1')=TRIM(TMP.INSTLD_PART)  AND
  TRIM(ONN.INSTLD_PART_SERIAL_NUM)=TRIM(TMP.INSTLD_PART_SERIAL_NUM) AND      
    nvl(to_number(TRIM(ONN.INSTLD_PART_CSN)),0)=
    nvl(to_number(TRIM(TMP.INSTLD_PART_CSN)),0)
    and REGEXP_LIKE(tmp.INSTLD_PART_CSN, '^-?\d+(\.\d+)?$'))

4 ответа

Решение

По возможности (в данном случае это так) вместо функций регулярных выражений используйте стандартные строковые функции, такие как SUBSTR, INSTR, TRANSLATE и т. Д. Регулярные выражения являются гораздо более мощными, но и гораздо более трудоемкими (именно по этой причине), поэтому их следует использовать только тогда, когда это действительно необходимо.

Если имя столбца str, затем:

case when translate(str, 'z0123456789', 'z') is null
     then ltrim(str, '0')
     else str                      end

TRANSLATE переведет z себе, все цифры в NULL и все остальные символы в себя. (Увы, требуется z или НЕКОТОРЫЙ нецифровый символ.)

Входные данные состоят из всех цифр, если и только если результат TRANSLATE равен NULL.

Демо-версия:

select str, case when translate(str, 'z0123456789', 'z') is null
                 then ltrim(str, '0')
                 else str
            end  as new_str
from
(
  select '000012345' as str from dual union all
  select '012321'    as str from dual union all
  select '00012JY12' as str from dual
);

STR       NEW_STR 
--------- ---------
000012345 12345    
012321    12321    
00012JY12 00012JY12

Использование regexp_replace(col, '^0+([[:digit:]]+)$', '\1'),

Это заменяет строки, которые состоят только из начальных нулей и конечных цифр, только из конечных цифр, тем самым удаляя нули.

Пример запроса:

select col, regexp_replace(col, '^0+([[:digit:]]+)$', '\1') as newvalue
from
(
  select '000012345' as col from dual
  union all
  select '012321' as col from dual
  union all
  select '00012JY12' as col from dual
);

Результат:

COL | NEWVALUE
---------- + ----------
000012345 | 12345
012321 | 12321
00012JY12 | 00012JY12

Если вы используете Oracle 12.2, вы можете использовать обработку ошибок CAST выражение.

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/CAST.html

Вдоль этого:

CASE WHEN CAST(<expression> AS NUMERIC DEFAULT NULL ON CONVERSION ERROR) IS NULL
     THEN <expression>
     ELSE TRIM(LEADING '0' FROM <expression>)
 END

замещать <expression> с вашим именем столбца (или как угодно). я использую null как магическая ценность в default null on conversion error пункт, но это не вредит, как null вход будет просто соответствовать THEN пункт и передать null через.

Вы можете создать функцию, которая проверяет, является ли она числовой или нет, см. Эту ссылку для примера функции,

проверить, есть ли в Oracle функция "это число"

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

Образец кода:

--get  the IS_NUMERIC function from the link 

SELECT DECODE(IS_NUMERIC(col1), 'Y', col1+0, 'N', col1) 
  FROM your_table;
Другие вопросы по тегам