1

我尝试在 Oracle 中获取一些东西,如果commission大于0.2我想要的'GOOD',否则'BAD'。如果commission is null我想得到0. 我知道这是 with NVL,但语法有问题。你能帮助我吗?

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

2 回答 2

6

首先,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;

在您的这种情况下,您将NULL在百分比恰好为 0.2 时得到。也许您只需要一个ELSE子句:

SELECT LAST_NAME,SALARY,
CASE WHEN NVL(COMMISSION_PCT) < 0.2 THEN
  'BAD'
ELSE
  'GOOD'
END as CommissionResult
FROM EMPLOYEES;
于 2015-11-01T07:51:24.270 回答
1
DECODE(
          NVL(COMMISSION_PCT),
          COMMISSION_PCT < 0,2,'BAD',COMMISSION_PCT > 0,2,'GOOD'
        )

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

  • NVL语法不完整
  • 您在十进制数中有错字,逗号而不是点。
  • DECODE语法不支持比较。

根据您的要求,您可以使用冗长且易于解释的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.
于 2015-11-01T07:56:12.507 回答