无法检索 NULL 数据

Unable to retrieve NULL data

我有三个字段类别、日期和 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 存在,其余的没有任何值 (NULL)。出于某种原因,当我运行查询时,它也会带走 NULL 值,所以我最终得到 0 行。这对我来说很陌生,我不明白是什么原因。我只知道 ID 号是字符串值。有什么建议吗?

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

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 ID IS NULL
AND Date = '01/06/2015'

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

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 ID N
AND Date = '01/06/2015'

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

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

等同于

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

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

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

请注意,当您使用 "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'

看看NULL comparison search conditions

Use the IS NULL or IS NOT NULL clauses to test for a NULL value. This can add complexity to the WHERE clause. For example, the TerritoryID column in the AdventureWorks2008R2 Customer table allows null values. If a SELECT statement is to test for null values in addition to others, it must include an IS NULL clause:

SELECT CustomerID, AccountNumber, TerritoryID
FROM AdventureWorks2008R2.Sales.Customer
WHERE TerritoryID IN (1, 2, 3)
   OR TerritoryID IS NULL

如果您真的希望能够直接将值与 NULL 进行比较,也可以这样做。这在上面的文章中也有描述:

Transact-SQL supports an extension that allows for the comparison operators to return TRUE or FALSE when comparing against null values. This option is activated by setting ANSI_NULLS OFF.