我试图在甲骨文中得到一些东西,如果commission大于0.2,我想得到'GOOD',否则是'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;发布于 2015-11-01 07:51:24
首先,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;发布于 2015-11-01 07:56:12
DECODE(
NVL(COMMISSION_PCT),
COMMISSION_PCT < 0,2,'BAD',COMMISSION_PCT > 0,2,'GOOD'
)您的查询在语法上不正确。
NVL语法不完整对于您的需求,您可以使用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.但是,如果必须使用解码,则需要使用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.https://stackoverflow.com/questions/33460173
复制相似问题