10

我有这张桌子:

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

4 回答 4

11

这是因为Null is undefined. Null 既不等于也不不等于任何东西。请在MSDN上阅读更多内容。

空值可以根据需要使用is null(or is not null) 或isnull() or coalesce()函数进行检查。

尝试这个:

SELECT * FROM Fruit WHERE Banana is null

并在以下查询中进行选择all the records以防万一@FruitInput is null

SELECT * FROM Fruit WHERE @FruitInput is null or Banana = @FruitInput
于 2013-11-06T15:01:27.883 回答
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, '')

编辑:不,你不能因为某种原因 0 = '' 在 SQL 中......?!

我想这样做的方法(可能不是那么高效,我没有检查过计划)是:

select * from Fruit 
where 1 = CASE
    WHEN @FruitInput IS NULL AND banana IS NULL THEN 1
    WHEN @FruitInput = banana THEN 1 
    ELSE 0
END
于 2013-11-06T15:01:52.257 回答
0

NULL 值表示该值未知。NULL 值不同于空值或零值。没有两个空值是相等的。两个空值之间或 NULL 与任何其他值之间的比较返回未知,因为每个 NULL 的值都是未知的。这里

SELECT * FROM Fruit WHERE Banana IS Null
于 2013-11-06T15:06:55.537 回答
0

值 NULL 表示该列的数据值未知或不可用,并且其中一个或多个表达式为 NULL 的比较产生未知,因此您不能直接将 Banana 与 null 进行比较,但您应该使用类似这样的东西:

SELECT * FROM Fruit
WHERE Banana = @FruitInput OR COALESCE(Banana, @FruitInput) IS NULL

Coalesce 将返回它找到的第一个非 null 值,如果所有值都为 null,则返回 null。前面的查询将返回所有行,Banana = @FruitInput以防它们都是非 Null,或者它们都是 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,更改其值将返回错误。

于 2013-11-07T11:23:07.053 回答