我要求从部门ID获取员工ID(考虑到一个部门最多只包含1名员工)
我可以做类似下面的事情:
Select emp_id from emp where dept_id = 101;
现在,如果这一行不存在,我将无法获得任何价值。
但是,由于我在PL / SQL层中使用此查询,它将抛出NO_DATA_FOUND异常(当db中没有员工时)
如果db中没有员工,你能否重构这个查询以返回一些emp_id = -1。
我可以执行类似下面的操作(导致2个sql查询,因此效率不高)
select count(1) INTO temp_count from emp where dept_id = 101; -- or use an exists clause
if (temp_count != 0)
Select emp_id from emp where dept_id = 101;
答案 0 :(得分:2)
尝试:
select nvl(min(emp_id),-1)
from emp
where dept_id = 101;
答案 1 :(得分:0)
除了提供的答案,您可以通过多种方式解决此问题。
您可以使用DECODE
,COALESCE
,NULLIF
,如下所示:
Select COALESCE(emp_id,<default value>) from emp where dept_id = 101;
Select DECODE(emp_id,NULL,<default value>,emp_id) from emp where dept_id = 101;
点击此链接NULL-Related Functions了解更多示例
答案 2 :(得分:0)
如果您正在使用PL / SQL,可能是一个函数,为什么不只是处理no_data_found错误,而不是使用sql语句并且可能使其效率降低?
E.g。类似的东西:
create or replace function get_emp_id (p_dept_id number)
return number
is
v_emp_id number;
begin
select emp_id
into v_emp_id
from emp
where dept_id = p_dept_id;
return v_emp_id;
exception
when no_data_found then
return -1;
end get_emp_id;
/
答案 3 :(得分:0)
您可以使用此代码块解决您的问题:
select t.emp_id
from (select nvl(e.emp_id
,-1) as emp_id
from emp e
where e.dept_id = 101) t
where t.emp_id <> -1
答案 4 :(得分:0)
您可以尝试以下代码块:
select case
when e.emp_id is null then
-1
else
e.emp_id
end as emp_id
from emp e
where e.dept_id = 101
答案 5 :(得分:0)
您可以使用以下代码 从emp中选择nvl(emp_id,default_value),其中dept_id = 101; 从emp中选择DECODE(emp_id,NULL,default_value,emp_id),其中dept_id = 101;