我的香蕉在哪里? (SQL Query NULL问题)

时间:2013-11-06 14:58:16

标签: sql sql-server null

我有这张桌子:

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 

为什么我的查询不会返回此记录?

4 个答案:

答案 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并且更改其值将返回错误。