如果它是数字则修剪前导零,如果是字母数字则修剪前缀为零

Sel*_*y S 1 sql oracle oracle11g leading-zero character-trimming

在列中,有以"0"开头的数字和字母数字值.如果它是数字,如何修剪前导零,如果它是Oracle中的字母数字,则不应修剪零.

我需要在WHERE Con​​dition中使用它.

防爆.

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+)?$'))
Run Code Online (Sandbox Code Playgroud)

mat*_*guy 6

只要有可能(在这种情况下),使用标准字符串函数,如SUBSTR,INSTR,TRANSLATE等,而不是正则表达式函数.正则表达式更强大,但也更耗时(正是因为这个原因),因此只有在真正需要时才能使用它们.

如果列名是str,则:

case when translate(str, 'z0123456789', 'z') is null
     then ltrim(str, '0')
     else str                      end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)