我有一个任务来检查字段是否包含null,如果是,我必须将其更改为0然后求和。
这就是表格的外观
Name Null? Type
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
我必须将字段SAL和COMM
相加所以我创建了这个SQL代码。
select ename, NVL(sal,0)+NVL(comm,0) money from emp;
它输出的一切正确
ENAME MONEY
---------- ----------
SMITH 800
ALLEN 1900
WARD 1750
JONES 2975
MARTIN 2650
BLAKE 2850
CLARK 2450
SCOTT 3000
KING 5000
TURNER 1500
ADAMS 1100
ENAME MONEY
---------- ----------
JAMES 950
FORD 3000
MILLER 1300
但是现在我必须使用 CASE 语句来做同样的事情。 但我似乎失败了我尝试的一切,也许是因为我还没有理解SQL中的案例如何运作良好。
我尝试的代码
select ename,
case
when comm is null then sal+0
when sal is null then comm+0
end nauda
from emp;
并输出了
ENAME MONEY
---------- ----------
SMITH 800
ALLEN
WARD
JONES 2975
MARTIN
BLAKE 2850
CLARK 2450
SCOTT 3000
KING 5000
TURNER
ADAMS 1100
ENAME MONEY
---------- ----------
JAMES 950
FORD 3000
MILLER 1300
答案 0 :(得分:2)
我更喜欢coalesce()
到nvl()
因为它是ANSI标准:
select ename, coalesce(sal, 0) + coalesce(comm, 0) as money
from emp;
这是解决问题的正确方法。但是,如果你想使用case
,这是一种方式:
select ename,
(case when sal is not null and comm is not null then sal + comm
when sal is not null then sal
when comm is not null then comm
else 0
end) as money
from emp;
答案 1 :(得分:0)
您还可以使用子查询,这样您就可以通过各种方式操作数据。也可以帮助在较小的数据集上做事。
select
ename,
comm,
sal
from
(select
ename,
nvl(com, 0) as comm,
nvl(sal, 0) as sal
from
emp)