这个我原来在SQL SERVER2005写的一个SQL见过 我也想过这个问题 where 后面条件=空的时候SQL SERVER2005他就是能出来值我当时用的是动态参数 我也不是很理解
子查询是NULL,返回结果应该是NULL,不可能是TRUE
lz用的就有问题吧。 要使用=,就要保证子查询确定有1个数据;不然,就使用in而不是=。
Oracle中的NULL代表的是无意义,或者没有值。 下面请看真值表: |AND NULL |OR NULL TRUE |NULL |TRUE 子查询中如果用 in/exists 类似于 OR NULL not in/not exists 类似于 AND NULL
楼主最好把代码贴出来看看 这样会更清楚些SQL> select * from t3;
ID NAME ---------- -------------------- 1 a 2 b 3 c SQL> select * from t3 where id = all(select 1 from dual);
ID NAME ---------- -------------------- 1 a
SQL> select * from t3 where id = all(select null from dual); --我试了一下 好像没出现你所说的情况
ID NAME ---------- --------------------
在子查询中 Any表示若表达式与子查询的结果之一满足比较关系,则搜索条件的值为真,若子查询的结果为无值,搜索条件的值为假。 Some与any的含义完全相同,可相互替换。 All表示若表达式与子查询返回的全部值都满足比较关系,则搜索条件的值为真,若子查询的结果为无值,搜索条件的值为真。 SQL> select * from test;NAME MONEY TIME ------------------------------ ---------- -------------- 张三 100 01-1月 -09 李四 70 01-1月 -09 张三 140 01-2月 -09 张三 120 01-3月 -09SQL> SELECT * FROM test t WHERE t.money = ALL (SELECT 1 FROM dual WHERE 1 = 2);NAME MONEY TIME ------------------------------ ---------- -------------- 张三 100 01-1月 -09 李四 70 01-1月 -09 张三 140 01-2月 -09 张三 120 01-3月 -09SQL> SELECT * FROM test t WHERE t.money <> ALL (SELECT 1 FROM dual WHERE 1 = 2);NAME MONEY TIME ------------------------------ ---------- -------------- 张三 100 01-1月 -09 李四 70 01-1月 -09 张三 140 01-2月 -09 张三 120 01-3月 -09SQL>
SQL> SELECT * FROM test t WHERE t.money = ANY (SELECT 1 FROM dual WHERE 1 = 2);未选定行SQL> SQL> SELECT * FROM test t WHERE t.money <> ANY (SELECT 1 FROM dual WHERE 1 = 2);未选定行SQL>
where 后面条件=空的时候SQL SERVER2005他就是能出来值我当时用的是动态参数
我也不是很理解
要使用=,就要保证子查询确定有1个数据;不然,就使用in而不是=。
下面请看真值表:
|AND NULL |OR NULL
TRUE |NULL |TRUE 子查询中如果用 in/exists 类似于 OR NULL
not in/not exists 类似于 AND NULL
ID NAME
---------- --------------------
1 a
2 b
3 c
SQL> select * from t3 where id = all(select 1 from dual);
ID NAME
---------- --------------------
1 a
SQL> select * from t3 where id = all(select null from dual); --我试了一下 好像没出现你所说的情况
ID NAME
---------- --------------------
Any表示若表达式与子查询的结果之一满足比较关系,则搜索条件的值为真,若子查询的结果为无值,搜索条件的值为假。
Some与any的含义完全相同,可相互替换。
All表示若表达式与子查询返回的全部值都满足比较关系,则搜索条件的值为真,若子查询的结果为无值,搜索条件的值为真。
SQL> select * from test;NAME MONEY TIME
------------------------------ ---------- --------------
张三 100 01-1月 -09
李四 70 01-1月 -09
张三 140 01-2月 -09
张三 120 01-3月 -09SQL> SELECT * FROM test t WHERE t.money = ALL (SELECT 1 FROM dual WHERE 1 = 2);NAME MONEY TIME
------------------------------ ---------- --------------
张三 100 01-1月 -09
李四 70 01-1月 -09
张三 140 01-2月 -09
张三 120 01-3月 -09SQL> SELECT * FROM test t WHERE t.money <> ALL (SELECT 1 FROM dual WHERE 1 = 2);NAME MONEY TIME
------------------------------ ---------- --------------
张三 100 01-1月 -09
李四 70 01-1月 -09
张三 140 01-2月 -09
张三 120 01-3月 -09SQL>
SQL> SELECT * FROM test t WHERE t.money <> ANY (SELECT 1 FROM dual WHERE 1 = 2);未选定行SQL>
具体实现 可能是 All是循环去比较子查询的值 如果没找到不符合的 结果就是true 因为子查询是空的 所以找不到不符合的 所以是true any的话就是循环去找符合条件的 如果找到1个就返回true 子查询是空的 自然找不到符合条件的 所以是falseany的逻辑是对的 但是all的逻辑总感觉是错的