sql语句 not in在表里有空值时就查询不到

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql语句 not in在表里有空值时就查询不到相关的知识,希望对你有一定的参考价值。

select * from 表1 where and 列1 not in(select 列2 from 表2)

情况是:语法及逻辑都没错,试了好几遍,就是因为表2里的列2有空值的行,所以查询不到。结果我换成是:

select * from 表1 where and 列1 not in(select isnull(列2,0) from 表2)
查到了。郁闷~~~ 不知道这是什么原因。小虾米求大虾米指教啊!!

参考技术A 操作列中存在空值时,相当于你那实际类型值和null值比较,是无法比较的,必须将null类型值通过isnull函数转换为一个字符型的值,这样才可以正常比较追问

应该是循环比较的吧。遇到null值了,后面的难道终止比较了?

追答

应该是这样,属于oracle内部执行机制,也不算报错,就是比不出结果了

参考技术B select * from table1 where table1.columnA not in(null)
是找不到结果的。你用函数isnull()来把空值用0来代替。则找到table1中列1 not in 0的记录。追问

我知道. 就是不明白是咋滴原因。

追答

就是因为表2里的列2有空值的行
例如结果是1,3,54,null,那么表1中列1 not in (1,3,54,null)的话,因为有null就会没有任何结果。
你查 in(null) 或 not in (null) 都没有结果。因为null代表没有任何内在分配。

参考技术C NULL 值是一个非常头疼的东西,建议入库后赋于默认值。
select * from (
select null as col1 from dual)
where col1 not in ('A1','A2') 或
where col1 in ('A1','A2')
你会发现什么也出不来。
参考技术D null是这样的,null不等于空 第5个回答  2012-02-02 空值用null字符串来代替不行吗?

SQL 中 NOT IN 查询不到数据

一、问题

用以下sql语句查询数据,结果为空

SELECT  a.ID ,
        a.Sub_Project_Name ,
        a.Sub_Project_Type
FROM    TB_KYSubProject a
WHERE   a.ID NOT IN (
        SELECT DISTINCT c.SubprojectID 
        FROM    TB_KYGrogramme c
        WHERE   ISNULL(c.Belong_Programme, \'\') <> \'\'
                AND c.Belong_Programme IN ( SELECT  ConfigValue
                                            FROM    PB_Config
                                            WHERE   ConfigKey = \'子项目共有所属方案\' ) )

 

但是查询TB_KYGrogramme和TB_KYSubProject都有数据,TB_KYSubProject比TB_KYGrogramme的数据还多,不应该没数据

TB_KYGrogramme

SELECT DISTINCT c.SubprojectID 
        FROM    TB_KYGrogramme c
        WHERE   ISNULL(c.Belong_Programme, \'\') <> \'\'
                AND c.Belong_Programme IN ( SELECT  ConfigValue
                                            FROM    PB_Config
                                            WHERE   ConfigKey = \'子项目共有所属方案\' )

 

TB_KYSubProject

SELECT DISTINCT a.ID 
FROM    TB_KYSubProject a

 

后面筛选TB_KYGrogramme,有一条数据SubprojectID是NULL

SELECT DISTINCT c.SubprojectID 
        FROM    TB_KYGrogramme c
        WHERE   ISNULL(c.Belong_Programme, \'\') <> \'\'
                AND c.Belong_Programme IN ( SELECT  c.ConfigValue
                                            FROM    PB_Config c
                                            WHERE   c.ConfigKey = \'子项目共有所属方案\' )
                                            AND c.SubprojectID  IS NULL

 

二、原因

SELECT  1 AS id ,
        1 AS subprojectid
UNION
SELECT  2 AS id ,
        2 AS subprojectid
UNION
SELECT  3 AS id ,
        3 AS subprojectid
UNION
SELECT  4 AS id ,
        NULL AS subprojectid

 

SELECT  *
FROM    ( SELECT    1 AS id ,
                    1 AS subprojectid
          UNION
          SELECT    2 AS id ,
                    2 AS subprojectid
          UNION
          SELECT    3 AS id ,
                    3 AS subprojectid
          UNION
          SELECT    4 AS id ,
                    NULL AS subprojectid
        ) vv
WHERE   subprojectid NOT IN ( 1, NULL )

等同

SELECT  *
FROM    ( SELECT    1 AS id ,
                    1 AS subprojectid
          UNION
          SELECT    2 AS id ,
                    2 AS subprojectid
          UNION
          SELECT    3 AS id ,
                    3 AS subprojectid
          UNION
          SELECT    4 AS id ,
                    NULL AS subprojectid
        ) vv
WHERE   subprojectid <> 1
        AND subprojectid <> NULL 

NULL值不能参与比较运算符,要筛选非NULL数据,要用 is not null,而不能用<>NULL,具体看下数据库中的三值逻辑(Tree-Value-Logic)

所以子查询有结果是NULL,那查询条件为空

 

三、方法

 知道问题原因,对sql语句修改,把SubprojectID是NULL的数据排查

SELECT  a.ID ,
        a.Sub_Project_Name ,
        a.Sub_Project_Type
FROM    TB_KYSubProject a
WHERE   a.ID NOT IN (
        SELECT DISTINCT c.SubprojectID 
        FROM    TB_KYGrogramme c
        WHERE   ISNULL(c.Belong_Programme, \'\') <> \'\'
                AND c.Belong_Programme IN ( SELECT  ConfigValue
                                            FROM    PB_Config
                                            WHERE   ConfigKey = \'子项目共有所属方案\' )  AND c.SubprojectID IS NOT NULL)

 

开发中遇到该问题记录下

以上是关于sql语句 not in在表里有空值时就查询不到的主要内容,如果未能解决你的问题,请参考以下文章

SQL 中 NOT IN 查询不到数据

怎么样用SQL语句查询某一个表里面的某一个字段的总和

Mysql查询in语句都走索引吗

SQL 中 not in 查询不到数据问题

SQL语句中 NOT IN 子句的“正确打开方式”

oracle_not exists和not in的用法和区别