SQL查询在数据库中不存在行时返回特定列或默认值

时间:2015-11-03 12:39:12

标签: sql oracle

我要求从部门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;

6 个答案:

答案 0 :(得分:2)

尝试:

select nvl(min(emp_id),-1) 
  from emp 
 where dept_id = 101;

答案 1 :(得分:0)

除了提供的答案,您可以通过多种方式解决此问题。

您可以使用DECODECOALESCENULLIF,如下所示:

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;