原来不是我一直以为的那样的(关于MySQL)

wsg 发布于 2012/07/03 13:53
阅读 246
收藏 0

表结构:

CREATE TABLE `tb` (
  `id` int(11) default NULL,
  `v` int(11) default NULL
) 

表里面的数据

    id       v  
------  --------
     1         2
     2    (NULL)
     3    (NULL)
     4    (NULL)

执行下面语句后,大家目测应该出什么结果?

SELECT * FROM tb WHERE v NOT IN (1, 2)

加载中
1
逝水fox
逝水fox

目测空集。对null值的判断,除了is null这一系列以外,得到的都一定是否定。这个通常应该和用什么数据库系统沒多大关系。对null的理解,不是没有值,而是不确定值。

0
wsg
wsg

引用来自“逝水fox”的答案

目测空集。对null值的判断,除了is null这一系列以外,得到的都一定是否定。这个通常应该和用什么数据库系统沒多大关系。对null的理解,不是没有值,而是不确定值。

SELECT   FROM   tb  WHERE   v   IN   (1, 2)的目测结果又是什么呢?
逝水fox
逝水fox
v=2 一行啊。理由刚才说了,null值的判断只有is null这一系列有可能为真。
0
李永波
李永波

引用来自“wsg”的答案

引用来自“逝水fox”的答案

目测空集。对null值的判断,除了is null这一系列以外,得到的都一定是否定。这个通常应该和用什么数据库系统沒多大关系。对null的理解,不是没有值,而是不确定值。

SELECT   FROM   tb  WHERE   v   IN   (1, 2)的目测结果又是什么呢?
  id       v
------------------

  1        2

这个比 你说的第一个更好解释

0
wsg
wsg

@李永波 @逝水fox
谢谢回复啊。
我一开始没有把【除了is null这一系列以外,得到的都一定是否定】理解清楚。

第二个的IN的用法,明白了。只是那个NOT IN的时候。有点麻烦(当值里面有null的时候)。

0
wsg
wsg
想了一个办法,对包含null值的列应用is not以外的否定形式的比较时(比如not in或者!=),可以把那个比较式按不考虑null的情况写好,然后套到下面这个的xx处
(((xx) AND NULL) IS NULL)

比如最开始的那个例子,就可把那个 v NOT IN (1, 2) 套到xx的地方,写成

SELECT * FROM tb WHERE (((v NOT IN (1, 2)) AND NULL) IS NULL)
0
wsg
wsg
唉,还是挺麻烦
0
wsg
wsg
还是干脆加个null的判断比较直观
SELECT * FROM tb WHERE ((v IS NULL) OR (v NOT IN (1, 2)))

逝水fox
逝水fox
沒索引的列ifnull函数应该可以用吧 吧null转换成个无效值再判断
0
unnamed
unnamed
就是null和任何值都是不相等的
返回顶部
顶部