检查列是否具有空值sql

时间:2014-04-10 19:48:05

标签: sql sql-server tsql

我试图确定产品表中是否存在产品。当我运行这个tsql时,它应该返回1并退出proc,因为产品表中不存在产品ID 7777,但是它返回0.如果我在没有if语句的情况下运行它只需执行select语句,就会说@prodIDnull。我想知道为什么它不会进入if语句,因为我正在检查它是否为空值。提前感谢您的帮助。

 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

5 个答案:

答案 0 :(得分:7)

在SQL Server中,使用IS NULL检查空值而不是= null

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

答案 1 :(得分:3)

使用IS NULL运算符。 此外,没有理由在RAISERROR之后编写代码,它不会被执行。

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

答案 2 :(得分:2)

使用nullunkown=等常规比较运算符时,将<><=进行比较会产生true ... false 1}}也不ISnull运算符可以与if(@ProdID is null) 进行比较。

{{1}}

答案 3 :(得分:2)

这取决于您的会话设置。 SQL-92标准规定,当其中一个操作数未知(NULL)和等于运算符的结果在三态逻辑中未知时会发生相等性,其威胁为false in二进制逻辑。但您可以取消设置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

答案 4 :(得分: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