我有三个字段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号是字符串值。有什么建议吗?
答案 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'