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);
 
 
posted @ 2020-02-26 16:40  ligfoo  阅读(1986)  评论(0编辑  收藏  举报