oracle數據庫IN 解析


1.IN的用法
oracle數據庫sql關鍵字 IN 有兩種用法,一種是IN操作符左側只有一個表達式,另一種用法是操作符左側有多個表達式。
 
 
如果使用的是第二種用法,則expression_list列表中的expression的數目和數據類型必須匹配操作符左側的表達式。
 
expression_list中最大指定1000個操作符。
 

oracle數據庫並不總是按照 IN  列表中出現的順序去計算expression_list表達式的值,但是子查詢select 子句中的列表總是按照指定的順序計算。
 
如果跟在 NOT IN  后面的列表中有任何一個元素為 NULL ,那么所有的行都會返回FALSE 或 UNKNOWN ,因此查詢不會返回任何行。
  
select * from (
select  1 id,'a' name from dual union all
select 4,'g' from dual union all
select 2, 'b' from dual )x
where id not in (1,NULL)
 
上面的結果不返回任何行,因為 WHERE  子句的條件等價於 id != 1 AND id != null
因為id 和 NULL 的比較返回 UNKNOWN ,因此整個表達式為 FALSE  。
 
這個行為很容易被忽略,特別是 NOT IN 引用子查詢時。
 

where 子句中的 [NOT]  IN 條件 ,如果條件的右邊是一個子查詢,你不能在條件的左側使用 LEVEL 關鍵字,但是你可以在 FROM 子句的子查詢中使用 LEVEL來獲得一樣的結果。
SELECT employee_id, last_name FROM employees
WHERE (employee_id, LEVEL)
IN (SELECT employee_id, 2 FROM employees)
START WITH employee_id = 2
CONNECT BY PRIOR employee_id = manager_id;
Preceding statement is not valid. But the following statement is valid because it encapsulates the query containing the LEVEL information in the FROM clause:
SELECT v.employee_id, v.last_name, v.lev FROM
(SELECT employee_id, last_name, LEVEL lev
FROM employees v
START WITH employee_id = 100
CONNECT BY PRIOR employee_id = manager_id) v
WHERE (v.employee_id, v.lev) IN
(SELECT employee_id, 2 FROM employees);
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM