我想知道字母字符是否有nvl函数,或者我必须在select语句中使用case?
前:
EMPNO
-----
73A69
7369B
C7369
7369
736,9
73,69
73e,69
73,e69
我希望得到这个结果:
0
0
0
7369
736,9
73,69
答案 0 :(得分:3)
Oracle 12cR2及更高版本:
replace
答案 1 :(得分:1)
我不确定您为什么将其称为nvl
,但如果您只是尝试将非数字字符串转换为0
,我可以&#I} #39; d确实使用case
表达式与regexp_like
调用:
SELECT CASE WHEN REGEXP_LIKE(empno, '^[0-9]+$') THEN TO_NUMBER(empno) ELSE 0 END
FROM emp;
答案 2 :(得分:0)
您在寻找正则表达式吗?
select (case when regexp_like(empno, '[^0-9,]' then 0 else empno end)
如果你想避免case
,你可以玩弄技巧,例如:
select coalesce(regexp_substr(empno, '^[0-9,]+$', 1, 1), '0')
但这基本上是相同的逻辑。
答案 3 :(得分:0)
这是我的最终解决方案
SELECT CASE WHEN REGEXP_LIKE(empno, '^[0-9]+([\,\.][0-9]+)?$') THEN
TO_NUMBER(empno) ELSE 0 END
FROM emp;
答案 4 :(得分:0)
您的主要问题是您找到的数字可以包含一个点或逗号,两者都代表小数点分隔符。你自己发了一个答案:
SELECT
CASE WHEN REGEXP_LIKE(empno, '^[0-9]+([\,\.][0-9]+)?$')
THEN TO_NUMBER(empno) ELSE 0 END
FROM emp;
但是在逗号或点上都会失败,因为默认情况下DBMS不会将它们都解释为小数点分隔符。
您当然可以简单地选择字符串:
SELECT
CASE WHEN REGEXP_LIKE(empno, '^[0-9]+([\,\.][0-9]+)?$')
THEN empno ELSE '0' END
FROM emp;
如果您需要选择转换为数字的字符串,请使字符串保持一致(即用逗号替换该点,反之亦然)并在使用TO_CHAR
时显示相应的格式:
SELECT
CASE WHEN REGEXP_LIKE(empno, '^[0-9]+([\,\.][0-9]+)?$')
THEN TO_NUMBER(REPLACE(empno, ',', '.'), '90.9999999') ELSE 0 END
FROM emp;
因此,从Oracle 12c第2版开始,您可以使用:
SELECT TO_NUMBER(REPLACE(empno, ',', '.') DEFAULT 0 ON CONVERSION ERROR, '90.9999999')
FROM emp;
(然而,后一个查询会接受'12,'
和'12.'
作为有效数字(即数字12),这是您的正则表达式禁止的。)