2013-07-09 146 views
2

NOT IN子句在检查条件时省略了值NULL值。NOT IN子句和NULL值

INPUT 
ID NAME 
1 A 
2 <null> 
3 C 

SELECT... FROM... 
WHERE NAME NOT IN ('C') 

仅返回ID值1,我既需要1 & 2.

能这样做吗?

+3

只需添加一个'或名称null'它的行结束 –

+0

http://stackoverflow.com/questions/12966873/mysql-why-is-null-ignored-in-mysql – asifsid88

+0

基本上你想要显示表格数据,除了名称是C ...? – Vishal

回答

5
WHERE NAME NOT IN ('C') OR NAME IS NULL 
0
SELECT... 
FROM... 
WHERE NAME NOT IN ('C') 
    OR NAME IS NULL 

SELECT... 
FROM... 
WHERE ISNULL(NAME, '') NOT IN ('C') 
+1

'ISNULL(NAME,'')NOT IN('C')'永远不会被优化。不应该假定为解决方案。 – zerkms

+0

同意 - 使用列上的任何函数使索引失效;这就是为什么当我看到类似“WHERE lower(username)=:param”这样的代码时我会畏缩,那么我会问,为什么这个查询太慢了“有一个用户名索引!” – Trent

+0

@zerkms - 虽然'NAME NOT IN('C')OR NAME IS NULL'可能会导致全表扫描,至少在Oracle上。 – APC

3

要么你检查NULL值

select * 
from not_in 
where name not in ('C') or name is null; 

,或者你可以在任何其它字符与聚结转换NULL值。我在下面的示例中使用''。

select * 
from not_in 
where coalesce(name, ' ') not in ('C');