Обрезать начальные нули, если он числовой, и не обрезать нули, если буквенно-цифровой
В столбце есть числовые и буквенно-цифровые значения, начинающиеся с "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;