【问题标题】:TSQL parameter with NULL value does not enter IF condition具有 NULL 值的 TSQL 参数不进入 IF 条件
【发布时间】:2012-11-07 22:18:46
【问题描述】:

我的查询如下所示:

use [dbName]

DECLARE @profile_id int
SET @profile_id = 18
DECLARE @test int

SET @test = (SELECT user_profile_id FROM tbl_profiles WHERE id = @profile_id)

SELECT @test as test

if @test = NULL
    SELECT 1

else 
    SELECT 2

我知道表中的值为 null,并且我可以看到 @test 被正确设置为该值,因为第一个 SELECT 显示:

 |test
1|NULL

但是,在 IF 条件下,变量不会被视为 NULL,因为只返回第三个 SELECT,显示:

 |(no column name)
1| 2

这是为什么呢?

【问题讨论】:

    标签: sql-server-2008 tsql if-statement null


    【解决方案1】:

    你需要使用IS NULL不是= NULL

    if @test IS NULL
        SELECT 1
    
    else 
        SELECT 2
    

    您可以从不NULL 与“常规”比较运算符进行比较 - 您总是只能使用 IS NULLIS NOT NULL

    NULL 本身确实不是一个价值 - 它是一个价值的缺失...

    【讨论】:

    • 只是为了确认,如果我更改连接设置,即SET ANSI_NULL OFF 即使这样我也不能比较它吗?
    • @ShantanuGupta:也许——但这绝对是不推荐,并且违反了 SQL-92 语言标准。不要依赖不符合标准的行为...另外,SQL Server 2012 documentation 提到在不久的将来,将其设置为OFF 的功能将被删除...
    • 感谢您的信息。我只是将它添加到我的知识中。虽然不打算这样做:)
    【解决方案2】:

    使用IS NULL。而不是:

    if @test = NULL
        SELECT 1
    
    else 
        SELECT 2
    

    试试这个:

    if @test IS NULL
        SELECT 1
    
    else 
        SELECT 2
    

    【讨论】:

      【解决方案3】:

      你为什么不使用条件(id = @profile_id AND @profile_id IS NOT NULL

      SELECT user_profile_id FROM tbl_profiles WHERE (id = @profile_id AND @profile_id IS NOT NULL)

      【讨论】:

      • 好吧,这只是我的一个查询,用于测试 IF ELSE 条件如何使用 NULL 值,但在实际查询中,我将不得不根据该条目是否执行不同的操作为 NULL。
      猜你喜欢
      • 2020-11-23
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      相关资源
      最近更新 更多