无法检索NULL数据

时间:2015-01-07 08:55:08

标签: 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意义为NULL值的记录,因为对于昨天的记录,只存在ID 1,2,3,而rest没有任何值(NULL)。出于某种原因,当我运行查询时它也会带走NULL值,所以我最终得到0行。这对我来说很陌生,我不明白是什么原因。我只知道ID号是字符串值。有什么建议吗?

7 个答案:

答案 0 :(得分:2)

试试这个。 NULL值不能等同于其他任何内容。

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

答案 1 :(得分:1)

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

WHERE ID NOT IN('1','2','3')

相当于

WHERE ID <> '1' AND ID <> '2' AND ID <> '3'

由于NULL <> anything产生UNKNOWN,你的表达式会产生UNKNOWN并且不会返回有问题的记录。

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

答案 2 :(得分:1)

看看NULL comparison search conditions

  

使用IS NULL或IS NOT NULL子句来测试NULL值。这个   可以增加WHERE子句的复杂性。例如,TerritoryID   AdventureWorks2008R2 Customer表中的列允许空值。   如果SELECT语句要测试除null之外的空值   其他,它必须包含一个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来激活此选项。

答案 3 :(得分:0)

您确定要将ID字段设为null吗?

以下是您的操作方法:(确定您的其他查询是否正常)

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

如果您想要的记录没有您需要的类别,请将您的查询更改为

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

答案 4 :(得分:0)

你有几个选择:

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

或者su8898说的是什么

答案 5 :(得分:0)

试试这个:

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

答案 6 :(得分:0)

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

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

如果您想要使用NULL以及ID NOT IN('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'