我有这张桌子:
CREATE TABLE [dbo].[Fruit](
[RecId] [int] IDENTITY(1,1) NOT NULL,
[Banana] [int] NULL,
[TextValue] [varchar](50) NULL
)
以下代码:
DECLARE @FruitInput INT = NULL
SELECT * FROM Fruit WHERE Banana = @FruitInput
该记录在该表中:
1|NULL|Hello
为什么我的查询不会返回此记录?
答案 0 :(得分:11)
这是因为Null is undefined
。 Null既不等也不等于任何东西。请详细阅读 MSDN 。
可以使用is null
(或is not null
)或isnull()
或 coalesce()
函数检查空值,具体取决于要求。
试试这个:
SELECT * FROM Fruit WHERE Banana is null
如果all the records
:
@FruitInput is null
SELECT * FROM Fruit WHERE @FruitInput is null or Banana = @FruitInput
答案 1 :(得分:3)
NULL不等于NULL,使用IS NULL进行空行检查:
SELECT * FROM Fruit WHERE Banana IS NULL
在这种情况下,因为变量中有NULL,所以可以使用ISNULL运算符:
SELECT * FROM Fruit WHERE ISNULL(Banana, 0) = ISNULL(@FruitInput, 0)
这将确保你可以检查NULL是什么值,或者比较0到0 - 显然如果你有Banana为NULL且@FruitInput为0的行,这将匹配它们,根据需要进行调整
(例如,你可以使用-1或字符串)
SELECT * FROM Fruit WHERE ISNULL(Banana, '') = ISNULL(@FruitInput, '')
编辑:不,你不能因为某种原因因为某种原因在SQL中使用了0 =''!<!p>
我认为这样做的方式(可能不是那个高效的,我没有检查过计划)是:
select * from Fruit
where 1 = CASE
WHEN @FruitInput IS NULL AND banana IS NULL THEN 1
WHEN @FruitInput = banana THEN 1
ELSE 0
END
答案 2 :(得分:0)
值为NULL表示该值未知。值NULL与空值或零值不同。没有两个空值相等。两个空值之间或NULL与任何其他值之间的比较返回未知,因为每个NULL的值未知。 Here
SELECT * FROM Fruit WHERE Banana IS Null
答案 3 :(得分:0)
值NULL表示列的数据值未知或不可用,并且一个或多个表达式为NULL的比较产生未知,因此您无法直接将Banana与null进行比较,但您应该使用像这样的东西:
SELECT * FROM Fruit
WHERE Banana = @FruitInput OR COALESCE(Banana, @FruitInput) IS NULL
Coalesce将返回它找到的第一个非null值,如果所有值都为null,则返回null。上一个查询将返回Banana = @FruitInput
所有行,如果它们都是非空的,或者它们都是Null,这相当于:
SELECT * FROM Fruit
WHERE (Banana = @FruitInput) OR (Banana IS NULL AND @FruitInput IS NULL)
您还可以使用允许与空值进行比较的扩展名:
SET ANSI_NULLS OFF;
SELECT * FROM Fruit WHERE Banana = NULL;
但最好避免在新的开发工作中使用此功能,因为在SQL Server的未来版本中ANSI_NULLS将始终为ON并且更改其值将返回错误。