如果单词有任何非数字字符,我需要用0替换整个单词。例如,如果digital_word ='22B4'则替换为0,否则如果digital_word ='224'则不替换。
SELECT replace_funtion(digital_word,'has non numeric character pattern',0,digital_word)
FROM dual;
我尝试了解码,regexp_instr,regexp_replace但无法提出正确的解决方案。 请指教。
谢谢。
答案 0 :(得分: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, ' +-.0123456789', ' '))),'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
答案 1 :(得分: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;
希望这有帮助。
答案 2 :(得分:1)
最快的方法是用null替换所有数字(以简单地删除它们)并查看是否有任何内容。您不需要正则表达式(慢!),只需要标准字符串函数NULL
。
不幸的是,Oracle必须解决他们自己对TRANSLATE()
的不一致处理 - 有时候是空字符串,有时候不是。在NULL
函数的情况下,您不能简单地将每个数字转换为空;你还必须将一个非数字字符翻译成它自己,这样第三个参数就不是一个空字符串(被视为真正的TRANSLATE()
,就像关系理论一样)。有关CASE
函数,请参阅Oracle文档。 https://docs.oracle.com/cd/E11882_01/server.112/e41084/functions216.htm#SQLRF06145
然后,可以使用NULL
表达式(或各种形式的CASE
处理函数获得结果;我更喜欢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, 'z0123456789', 'z') is null
then num
else '0'
end as result
from nums
;
NUM RESULT
--- ------
123 123
-56 0
7A9 0
0.9 0
,即SQL Standard):
varchar2
注意:此处的所有内容都是TO_NUMBER()
数据类型(或其他类型的字符串数据类型)。如果结果应转换为数字,请将整个案例表达式包装在'-56'
中。另请注意,字符串'0.9'
和'0'
不是全数字(它们包含非数字),因此两者的结果均为https://myapi.com/users/PLLFFR6
。如果这不是您所需要的,您必须更正原始帖子中的问题陈述。
答案 3 :(得分:-1)
以下更新查询之类的内容可以帮助您:
update [table] set [col] = '0'
where REGEXP_LIKE([col], '.*\D.*', 'i')