[英]SQL query into a table to find the row with the minimal value >= X for a particular column
[英]SQL query to return a particular column or a default value in case of row not existing in the db
我有一個從部門ID獲取員工ID的要求(請考慮一個部門最多只能包含1名員工)
我可以做以下事情:
Select emp_id from emp where dept_id = 101;
現在,如果該行不存在,我將不會獲得任何價值。
但是,由於我在PL / SQL層中使用此查詢,因此它將引發NO_DATA_FOUND異常(當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;
嘗試:
select nvl(min(emp_id),-1)
from emp
where dept_id = 101;
除了提供的答案以外,還有多種方法可以滿足此要求。
您可以使用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相關的功能以獲取更多示例
如果您使用的是PL / SQL(可能是一個函數),為什么不只處理no_data_found錯誤,而不是隨意使用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;
/
您可以使用此代碼塊解決問題:
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
您可以嘗試以下代碼塊:
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
您可以使用以下代碼從emp中選擇nvl(emp_id,default_value),其中dept_id = 101; 從emp中選擇DECODE(emp_id,NULL,default_value,emp_id),其中dept_id = 101;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.