[英]Trim leading zeroes if it is numeric and not trim zeroes if it is alphanumeric
在一列中,存在以“ 0”開頭的數字和字母數字值。 在Oracle中,如何修剪前導零(如果是數字),以及如何修剪零(如果是字母數字)。
我需要在WHERE條件下使用它。
例如
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+)?$'))
盡可能(在這種情況下)使用標准字符串函數(例如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
表達式的錯誤處理。
伴隨着:
CASE WHEN CAST(<expression> AS NUMERIC DEFAULT NULL ON CONVERSION ERROR) IS NULL
THEN <expression>
ELSE TRIM(LEADING '0' FROM <expression>)
END
將<expression>
替換為您的列名(或其他名稱)。 我default null on conversion error
子句的default null on conversion error
中將null
用作魔術值,但這無害,因為null
輸入將僅匹配THEN
子句並通過null
。
您可以創建一個函數來檢查它是否為數字,請參見此鏈接以獲取函數示例,
您只需將數字加零即可對數字的零進行微調,
樣例代碼:
--get the IS_NUMERIC function from the link
SELECT DECODE(IS_NUMERIC(col1), 'Y', col1+0, 'N', col1)
FROM your_table;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.