Oracle SQL通过DECODE进行比较

时间:2015-11-01 07:40:42

标签: sql oracle nvl

如果commission大于0.2我想获得'GOOD',我会尝试在Oracle中获取内容,否则'BAD'。如果commission is null我想获得0。我知道这是NVL,但语法出了问题。你能救我吗?

SELECT LAST_NAME,
       SALARY,
       DECODE(
              NVL(COMMISSION_PCT),
              COMMISSION_PCT < 0,2, 'BAD', COMMISSION_PCT > 0,2, 'GOOD'
            ) CommissionResult
FROM EMPLOYEES;

2 个答案:

答案 0 :(得分:3)

首先,0.2应写为0.2,而非0,2。但最重要的是,decode不适合这种情况。

在这种情况下(以及可以使用解码的所有其他情况),您可以使用case,这更灵活,更冗长,因此也更容易阅读。

SELECT LAST_NAME,SALARY,
CASE WHEN NVL(COMMISSION_PCT) < 0.2 THEN
  'BAD'
WHEN COMMISSION_PCT > 0.2 THEN 
  'GOOD'
END as CommissionResult
FROM EMPLOYEES;

在这种情况下,当百分比正好为0.2时,您将获得NULL。也许你只需要一个ELSE条款:

SELECT LAST_NAME,SALARY,
CASE WHEN NVL(COMMISSION_PCT) < 0.2 THEN
  'BAD'
ELSE
  'GOOD'
END as CommissionResult
FROM EMPLOYEES;

答案 1 :(得分:1)

DECODE(
          NVL(COMMISSION_PCT),
          COMMISSION_PCT < 0,2,'BAD',COMMISSION_PCT > 0,2,'GOOD'
        )

您的查询在语法上是不正确的。

  • NVL语法不完整
  • 十进制数字中有拼写错误,逗号代替点。
  • DECODE 语法不支持比较。

根据您的要求,您可以使用详细且易于理解的 CASE 表达式。

使用 CASE

例如,使用SCOTT模式中的标准 EMP 表:

SQL> SELECT ename,
  2    sal,
  3    CASE
  4      WHEN NVL(comm, 0) < 0.2
  5      THEN 'BAD'
  6      WHEN NVL(comm, 0) > 0.2
  7      THEN 'GOOD'
  8    END CommissionResult
  9  FROM emp;

ENAME             SAL COMM
---------- ---------- ----
SMITH             800 BAD
ALLEN            1600 GOOD
WARD             1250 GOOD
JONES            2975 BAD
MARTIN           1250 GOOD
BLAKE            2850 BAD
CLARK            2450 BAD
SCOTT            3000 BAD
KING             5000 BAD
TURNER           1500 BAD
ADAMS            1100 BAD
JAMES             950 BAD
FORD             3000 BAD
MILLER           1300 BAD

14 rows selected.

但是,如果您必须使用 DECODE ,则需要使用 SIGN 来提供相同的功能。

使用解码

SQL> SELECT ename,
  2    sal,
  3    DECODE( SIGN(NVL(comm, 0) - 0.2), -1, 'BAD', +1, 'GOOD') CommissionResult
  4  FROM emp;

ENAME             SAL COMM
---------- ---------- ----
SMITH             800 BAD
ALLEN            1600 GOOD
WARD             1250 GOOD
JONES            2975 BAD
MARTIN           1250 GOOD
BLAKE            2850 BAD
CLARK            2450 BAD
SCOTT            3000 BAD
KING             5000 BAD
TURNER           1500 BAD
ADAMS            1100 BAD
JAMES             950 BAD
FORD             3000 BAD
MILLER           1300 BAD

14 rows selected.