2017-08-31 19 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'。如果这不是您需要的,您必须更正原始帖子中的问题陈述。