2017-08-31 18 views
0

如果該單詞有任何非數字字符,我需要用整數0替換整個單詞。例如,如果digital_word ='22B4'則用0代替,否則如果digital_word ='224'則不要替換。PL SQL取代有條件的建議

SELECT replace_funtion(digital_word,'has non numeric character pattern',0,digital_word) 
FROM dual; 

我試過解碼,regexp_instr,regexp_replace,但無法拿出正確的解決方案。 請指教。

謝謝。

+0

爲什麼你需要一個函數(PL/SQL)呢?你不要! – mathguy

回答

-1

類似下面的更新查詢將幫助您:

update [table] set [col] = '0' 
where REGEXP_LIKE([col], '.*\D.*', 'i') 
+2

誰說'update'?爲什麼你需要正則表達式中的'。*'?爲什麼你需要不區分大小寫的比較? – mathguy

2

的想法很簡單 - 你需要檢查,如果值是數字,或不

腳本:

with nums as 
(
select '123' as num from dual union all 
select '456' as num from dual union all 
select '7A9' as num from dual union all 
select '098' as num from dual 
) 
select n.* 
,nvl2(LENGTH(TRIM(TRANSLATE(num, ' +-.', ' '))),'0',num) 
from nums n 

結果

1 123 123 
2 456 456 
3 7A9 0 
4 098 098 

看到更多的文章下面來看看哪種方式是更好地你

How can I determine if a string is numeric in SQL?

https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:15321803936685

How to tell if a value is not numeric in Oracle?

+0

OP討論「非數字」 - 所以如果輸入具有字符+或。那麼它就是「非數字」,無論它們如何被用來表示「數字」。 – mathguy

2

你可以嘗試以下操作:

SELECT CASE WHEN REGEXP_LIKE(digital_word, '\D') THEN '0' ELSE digital_word END 
    FROM dual; 

正則表達式類\D匹配任何非數字字符。你也可以使用[^0-9]達到同樣的效果:

SELECT CASE WHEN REGEXP_LIKE(digital_word, '\D') THEN '0' ELSE digital_word END 
    FROM dual; 

或者你可以看到如果digital_word的價值是由什麼,但數字:

SELECT CASE WHEN REGEXP_LIKE(digital_word, '^\d+$') THEN digital_word ELSE '0' END 
    FROM dual; 

希望這有助於。

1

最快的方法是用空替換所有數字(以簡單地刪除它們)並查看是否有剩餘。你不需要正則表達式(slow!),你只需要標準字符串函數TRANSLATE()

不幸的是,Oracle必須解決自己對NULL的不一致處理 - 有時候是空字符串,有時候不是。在TRANSLATE()函數的情況下,不能簡單地將每個數字轉換爲無;您還必須將非數字字符轉換爲自身,以便第三個參數不是空字符串(與關係理論中一樣,被視爲實際NULL)。請參閱TRANSLATE()函數的Oracle文檔。https://docs.oracle.com/cd/E11882_01/server.112/e41084/functions216.htm#SQLRF06145

然後,可以用一個CASE表達式獲得的結果(或各種形式的NULL處理功能;我更喜歡CASE,這是SQL標準):

with 
    nums (num) as (
     select '123' from dual union all 
     select '-56' from dual union all 
     select '7A9' from dual union all 
     select '0.9' from dual 
    ) 
-- End of simulated inputs (for testing only, not part of the solution). 
-- SQL query begins BELOW THIS LINE. Use your own table and column names. 
select num, 
     case when translate(num, 'z', 'z') is null 
      then num 
      else '0' 
     end as result 
from nums 
; 

NUM RESULT 
--- ------ 
123 123 
-56 0 
7A9 0 
0.9 0 

注:這裏的一切是在varchar2數據類型(或某種其他類型的字符串數據類型)。如果結果應轉換爲數字,則將整個案例表達式包含在TO_NUMBER()之內。還請注意,字符串'-56''0.9'不是全數字(它們包含非數字),因此結果爲'0'。如果這不是您需要的,您必須更正原始帖子中的問題陳述。