是否有函数返回非有效数字的字符串的默认值

时间:2018-05-22 15:48:00

标签: sql oracle select

我想知道字母字符是否有nvl函数,或者我必须在select语句中使用case?

前:

EMPNO 
-----  
73A69
7369B
C7369
7369
736,9
73,69
73e,69
73,e69

我希望得到这个结果:

0
0
0
7369
736,9
73,69

5 个答案:

答案 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),这是您的正则表达式禁止的。)