ORA-00907: missing right parenthesis
00907\. 00000 - "missing right parenthesis"
SELECT last_name
,salary
,DECODE(salary, salary < 6000, 0.36,
salary < 8000, 0.38,
salary < 10000, 0.4,
salary < 12000, 0.42,
salary < 14000, 0.44,
salary < 16000, 0.45) as "TAX RATE"
FROM employees;
CodePudding user response:
Don't make your life a misery. Use CASE
expression instead of DECODE
.
select case when salary < 6000 then 0.36
when salary < 8000 then 0.38
...
when salary < 16000 then 0.45
else null
end as tax_rate
from employees
If you'd want to do it with DECODE
, you'd use SIGN
function (to check whether salary is less than certain amount), and then nest as many DECODE
s as necessary. That works, but is a nightmare to maintain.
I don't have your table so I'll try to illustrate it using Scott's emp
:
SQL> select ename, sal,
2 decode(sign(sal - 1000), -1, 'less than 1000',
3 decode(sign(sal - 1500), -1, 'less than 1500',
4 decode(sign(sal - 2000), -1, 'less than 2000'))
5 ) rate
6 from emp;
ENAME SAL RATE
---------- ---------- --------------
SMITH 840 less than 1000
ALLEN 1600 less than 2000
WARD 1250 less than 1500
JONES 2975
MARTIN 1250 less than 1500
BLAKE 2850
CLARK 2450
SCOTT 3000
KING 5000
<snip>
If you compare it to CASE
, difference is more than obvious:
SQL> select ename, sal,
2 case when sal < 1000 then 'less than 1000'
3 when sal < 1500 then 'less than 1500'
4 when sal < 2000 then 'less than 2000'
5 end rate
6 from emp;
ENAME SAL RATE
---------- ---------- --------------
SMITH 840 less than 1000
ALLEN 1600 less than 2000
WARD 1250 less than 1500
JONES 2975
MARTIN 1250 less than 1500
<snip>