簡體   English   中英

如果是數字則修剪前導零,如果是字母數字則修剪不零。

[英]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表達式的錯誤處理。

https://docs.oracle.com/zh_CN/database/oracle/oracle-database/12.2/sqlrf/CAST.html#GUID-5A70235E-1209-4281-8521-B94497AAEF75

伴隨着:

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

您可以創建一個函數來檢查它是否為數字,請參見此鏈接以獲取函數示例,

檢查Oracle中“是否為數字”功能

您只需將數字加零即可對數字的零進行微調,

樣例代碼:

--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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM