检查一个列是否有空值 T-SQL

5

我试图确定产品表中是否已经存在某个产品。当我运行这段 tsql 代码时,它应该返回 1 并退出存储过程,因为产品 ID 7777 在产品表中不存在,但是它返回了 0。如果我不使用 if 语句,只执行 select 语句,它会说 @prodIDnull。我想知道为什么它没有进入 if 语句,因为我正在检查它是否为 null 值。提前感谢任何帮助。

 Declare  @ProdID int

 select @ProdID = dbo.productTbl.ProductID
 from dbo.ProductTbl
 inner join dbo.OrderTbl
 on dbo.ProductTbl.ProductID = dbo.OrderTbl.ProductID
 where dbo.OrderTbl.ProductID = 7777


 if(@ProdID = null)
 begin 
 raiserror('The product does not exist',16,1)
 return 1
 end
 return 0

1
它不等于null,它是null~ - Hogan
@Hogan 这是真的,但为了OP辩护,SQL Server在这个定义上并不是非常一致。你只需要看一下更新值为NULL的语法:UPDATE TABLE SET Col = NULL - Lamak
@Lamak 赋值和比较是不同的。 - Hogan
@Hogan 我知道差异,只是说这并不一致。 - Lamak
@Lamak -- 这一直是我记住区别的助记符 - Hogan
5个回答

10
在 SQL Server 中,使用 IS NULL 来检查空值,而不是使用 = null
if(@ProdID IS NULL)
begin 
raiserror('The product does not exist',16,1)
return 1
end
return 0

4

使用 IS NULL 运算符。 此外,在 RAISERROR 后面写代码是没有意义的,因为它不会被执行。

IF @ProdID IS NULL
    RAISERROR('The product does not exist',16,1)

如果(1>0)开始,引发错误('x',16,1),打印1,结束。 <-- 这段代码会引发错误并打印出数字 - Kapol

2

使用普通比较运算符(如=<><=等)将任何内容与null进行比较会导致unkown的结果,既不是true也不是false。使用IS运算符可以与null进行比较。

if(@ProdID is null)

2

这取决于您的会话设置。 SQL-92 标准规定,当操作数之一未知(NULL)时,等式不可能发生,并且在三态逻辑中等式运算符的结果未知,在二进制逻辑中被视为 false。但是,您可以取消 SQL Server 的 ANSI_NULLS 设置(不建议),并使用 = 运算符。

SET ANSI_NULLS OFF
GO
DECLARE @ProdID int
IF(@ProdID = NULL)
  PRINT 'ANSI_NULLS OFF'

将打印ANSI_NULLS OFF

SET ANSI_NULLS ON
GO
DECLARE @ProdID int
IF(@ProdID = NULL)
  PRINT 'ANSI_NULLS OFF'

没有可打印的内容

SET ANSI_NULLS ON
GO
DECLARE @ProdID int
IF(@ProdID IS NULL)
  PRINT 'ANSI_NULLS ON'

将会打印出 ANSI_NULLS ON

我读到在未来版本的SQL Server中,ANSI_NULLS将始终被设置为开启状态,任何将其关闭的应用程序都会产生错误。因此,开发人员应避免将其关闭。 - Knightwisp
@Knightwisp,在这篇帖子中有一个加粗的短语。 - Hamlet Hakobyan
我看到了。只是让大家知道这个选项将被取消。 - Knightwisp

0

正如其他人所提到的,NULL 应该被理解为未知。一旦你意识到这一点,下面的比较表就会变得非常有意义:

Cond1       Cond2       Cond1 AND Cond2     Cond1 OR Cond2
True        Unknown     Unknown             True
False       Unknown     Unknown             Unknown
Unknown     Unknown     Unknown             Unknown     

如果你真的想知道它是否未知,请使用IS NULL而不是= NULL


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接