Sql 无法检索空数据

Sql 无法检索空数据,sql,sql-server,Sql,Sql Server,我有三个字段Category、Date和ID。我需要检索不属于特定ID的数据。以下是我的查询示例: SELECT Category, Date, ID FROM table WHERE ID NOT IN('1','2','3') AND Date = '01/06/2015' 运行此查询后,我应该只获取没有任何ID的记录,这意味着空值,因为对于昨天的记录,只有ID 1、2、3存在,其余的没有任何值(空)。出于某种原因,当我运行查询时,它也会删除空值,因此我最终得到0行。这对我来说非常陌生,我

我有三个字段Category、Date和ID。我需要检索不属于特定ID的数据。以下是我的查询示例:

SELECT Category, Date, ID
FROM table
WHERE ID NOT IN('1','2','3')
AND Date = '01/06/2015'

运行此查询后,我应该只获取没有任何ID的记录,这意味着空值,因为对于昨天的记录,只有ID 1、2、3存在,其余的没有任何值(空)。出于某种原因,当我运行查询时,它也会删除空值,因此我最终得到0行。这对我来说非常陌生,我不明白原因是什么。我只知道ID号是字符串值。有什么建议吗?

试试这个。空值不能等同于任何其他值

SELECT Category, Date, ID
FROM table
WHERE (ID NOT IN('1','2','3') OR ID IS NULL)
AND Date = '01/06/2015'

试试这个。空值不能等同于任何其他值

SELECT Category, Date, ID
FROM table
WHERE (ID NOT IN('1','2','3') OR ID IS NULL)
AND Date = '01/06/2015'

您确定要将ID字段设置为空吗

下面是您的操作方法:(假设您的其余查询都可以)

如果希望记录没有类别,则需要将查询更改为

SELECT Category, Date, ID
FROM table
WHERE Category IS NULL
AND Date = '01/06/2015'

您确定要将ID字段设置为空吗

下面是您的操作方法:(假设您的其余查询都可以)

如果希望记录没有类别,则需要将查询更改为

SELECT Category, Date, ID
FROM table
WHERE Category IS NULL
AND Date = '01/06/2015'

你有几个选择:

SELECT Category, Date, ID
FROM table
WHERE ISNULL(ID, '4') NOT IN('1','2','3')
AND Date = '01/06/2015'

或者su8898所说的话

您有两种选择:

SELECT Category, Date, ID
FROM table
WHERE ISNULL(ID, '4') NOT IN('1','2','3')
AND Date = '01/06/2015'
或者su8898所说的

试试这个:

SELECT Category, Date, ID
FROM table
WHERE ID N
AND Date = '01/06/2015'
试试这个:

SELECT Category, Date, ID
FROM table
WHERE ID N
AND Date = '01/06/2015'

其他人已经展示了如何解决这个问题,所以让我试着解释一下为什么会发生这种情况

WHERE ID NOT IN('1','2','3')
相当于

WHERE ID <> '1' AND ID <> '2' AND ID <> '3'
其中ID“1”和ID“2”以及ID“3”
由于
NULL anything
产生UNKNOWN,因此表达式产生UNKNOWN,并且不返回相关记录

有关此三元逻辑的详细信息,请参阅以下Wikipedia文章:


    • 其他人已经展示了如何解决这个问题,所以让我试着解释一下为什么会发生这种情况

      WHERE ID NOT IN('1','2','3')
      
      相当于

      WHERE ID <> '1' AND ID <> '2' AND ID <> '3'
      
      其中ID“1”和ID“2”以及ID“3”
      
      由于
      NULL anything
      产生UNKNOWN,因此表达式产生UNKNOWN,并且不返回相关记录

      有关此三元逻辑的详细信息,请参阅以下Wikipedia文章:


      请注意,当您使用“IN”或“NOT IN”时,如果列具有空值,则不会获取任何值

      在您的情况下,如果您只想获取ID=NULL的记录,那么可以尝试上面建议的解决方案vgSefa

      如果您想提取所有带有NULL以及ID不在('1'、'2'、'3')中的记录,那么您可以尝试以下方法

      SELECT Category, Date, ID
      FROM table
      WHERE ID IS NULL
      AND Date = '01/06/2015'
      
      UNION ALL
      
      SELECT Category, Date, ID
      FROM table
      WHERE ID NOT IN('1','2','3')
      AND ID IS NOT NULL
      AND Date = '01/06/2015'
      

      请注意,当您使用“IN”或“NOT IN”时,如果列具有空值,则不会获取任何值

      在您的情况下,如果您只想获取ID=NULL的记录,那么可以尝试上面建议的解决方案vgSefa

      如果您想提取所有带有NULL以及ID不在('1'、'2'、'3')中的记录,那么您可以尝试以下方法

      SELECT Category, Date, ID
      FROM table
      WHERE ID IS NULL
      AND Date = '01/06/2015'
      
      UNION ALL
      
      SELECT Category, Date, ID
      FROM table
      WHERE ID NOT IN('1','2','3')
      AND ID IS NOT NULL
      AND Date = '01/06/2015'
      
      看一看

      使用IS NULL或IS NOT NULL子句测试NULL值。这 可以增加WHERE子句的复杂性。例如,TerritoryID AdventureWorks2008R2客户表中的列允许空值。 如果SELECT语句要测试除 其他情况下,它必须包含IS NULL子句:

      SELECT CustomerID, AccountNumber, TerritoryID
      FROM AdventureWorks2008R2.Sales.Customer
      WHERE TerritoryID IN (1, 2, 3)
         OR TerritoryID IS NULL
      
      如果您确实希望能够直接将值与NULL值进行比较,也可以这样做。这一点在上述文章中也有描述:

      Transact-SQL支持允许进行比较的扩展 运算符在与空值进行比较时返回TRUE或FALSE。 通过将ANSI_NULLS设置为OFF可激活此选项

      看一看

      使用IS NULL或IS NOT NULL子句测试NULL值。这 可以增加WHERE子句的复杂性。例如,TerritoryID AdventureWorks2008R2客户表中的列允许空值。 如果SELECT语句要测试除 其他情况下,它必须包含IS NULL子句:

      SELECT CustomerID, AccountNumber, TerritoryID
      FROM AdventureWorks2008R2.Sales.Customer
      WHERE TerritoryID IN (1, 2, 3)
         OR TerritoryID IS NULL
      
      如果您确实希望能够直接将值与NULL值进行比较,也可以这样做。这一点在上述文章中也有描述:

      Transact-SQL支持允许进行比较的扩展 运算符在与空值进行比较时返回TRUE或FALSE。 通过将ANSI_NULLS设置为OFF可激活此选项


      为什么不添加
      并且ID不是NULL
      ?ID是主键吗?ID不是主键。如果ID 4存在的话,我希望它将来会出现,所以我的目的不是只获取空值,而是现在剩下的,为什么不添加
      并且ID不是空的
      ?ID是主键吗?ID不是主键。如果ID=4存在的话,我希望它在将来出现,所以我的目的不仅仅是得到空值,而是现在剩下的,所以让我们假设今天我得到ID=4的记录,它会成为结果的一部分吗。我只是想澄清一下,我不只是想得到空值,我想得到除了ID 1,2,3之外的所有东西,但是由于昨天的数据没有任何其他ID,我留下了空记录。所以今天我得到了ID=4的记录,它会是空值结果的一部分吗。我只是想澄清一下,我不只是想得到空值,我想得到除ID 1、2、3之外的所有信息,但由于昨天的数据没有任何其他ID,我留下了空记录。非常感谢!第二个选项是我想要的:空值加上4,5,6。。太好了,谢谢你!第二个选项是我想要的:空值加上4,5,6。。身份证