Sel*_*y S 1 sql oracle oracle11g leading-zero character-trimming
在列中,有以"0"开头的数字和字母数字值.如果它是数字,如何修剪前导零,如果它是Oracle中的字母数字,则不应修剪零.
我需要在WHERE Condition中使用它.
防爆.
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)
只要有可能(在这种情况下),使用标准字符串函数,如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)
| 归档时间: |
|
| 查看次数: |
544 次 |
| 最近记录: |