SQL查询,在数据库中不存在行的情况下返回特定列或默认值 我要求从部门ID获得雇员ID,考虑到一个部门最多只包含1名员工

SQL查询,在数据库中不存在行的情况下返回特定列或默认值 我要求从部门ID获得雇员ID,考虑到一个部门最多只包含1名员工,sql,oracle,Sql,Oracle,我可以做如下事情: Select emp_id from emp where dept_id = 101; 如果这一行不存在,我将不会得到任何值 但是,由于我在PL/SQL层中使用此查询,所以当数据库中不存在员工时,它将抛出一个NO_DATA_FOUND异常 如果数据库中不存在雇员,您能否重构此查询以返回一些emp_id=-1 我可以做下面这样的事情,这会导致2个sql查询,所以效率不高 select count(1) INTO temp_count from emp where dept

我可以做如下事情:

 Select emp_id from emp where dept_id = 101;
如果这一行不存在,我将不会得到任何值

但是,由于我在PL/SQL层中使用此查询,所以当数据库中不存在员工时,它将抛出一个NO_DATA_FOUND异常

如果数据库中不存在雇员,您能否重构此查询以返回一些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;
尝试:


除了提供的答案之外,还有多种方法可以满足此需求

如果如下所示,您可以使用DECODE、COALESCE和null:

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;

查看此链接了解更多示例

如果您使用的是PL/SQL,可能是一个函数,为什么不只是处理未找到数据的错误,而不是摆弄SQL语句并可能降低其效率

例如,类似于:

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;
/

您可以使用此代码块解决您的问题:

选择t.emp\u id 从中选择nvle.emp\u id ,-1作为emp_id 来自emp e 式中,e.dept_id=101 t 其中t.emp_id-1

您可以尝试以下代码块:

选择案例 当e.emp_id为空时 -1 其他的 e、 emp_id 以emp_id结束 来自emp e 其中e.dept_id=101 您可以使用以下代码 从emp中选择nvlemp_id,默认值,其中dept_id=101;
选择decode emp_id,NULL,默认值,emp_id from emp,其中dept_id=101

将逻辑放入异常块通常没有意义,速度也较慢。此外,如果超过1个块可以抛出同一个异常呢?将逻辑放入异常块通常没有意义。。。嗯??你从哪里得到这个主意的?处理异常情况正是异常块存在的原因!至于它是缓慢的;这真的是一个问题吗?如果在这个特定场景中确实如此的话?我很想看看你的证词。对于引发相同异常的多个块。。。这就是模块化的目的!如果我无法找到任何资源进行备份,我可能会提出另一个问题来验证这一点。我的陈述来自其他人告诉我的,以及我对Java的了解,这可能适用,也可能不适用here@rents我想这取决于您如何使用查询。如果找不到数据是一种罕见的情况,那么使用异常处理程序句柄,然后直接选择然后跳转到异常块不会导致太多的速度减慢。如果没有返回行是一种常见的情况,那么我可能会完全避免使用隐式游标,而是使用带有开放获取的显式游标。这样,您就可以处理返回行与未返回行的情况,而无需修改sql语句,这可能会降低所有查询和…@rents的速度。。。b避免未找到数据的异常。我同意最好避免使用异常块作为鬼鬼祟祟的goto形式,但这主要是为了便于维护。谢谢,这很聪明。即使删除最后一行,也不会输出任何行,即where条件,我遗漏了什么吗?你不会遗漏什么,这个条件没有数据e.dept_id=101。正如我在问题中提到的,我确实需要这种情况下的返回值,这就是问这个问题的目的。可能问题描述不太清楚。我理解,我将为您的问题提供另一种解决方案。所有查询都不返回-1,它们不返回行。见@peter Alexeevanswer@rents你可以用这个。
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;
/