【问题标题】:Null value column and NOT EXISTS T-sql空值列且不存在 T-sql
【发布时间】:2010-10-26 21:30:35
【问题描述】:

我正在尝试执行以下操作:

IF NOT EXISTS ( 
                SELECT  *   
                FROM    [tbl_web_company] 
                WHERE   [name]          = @name
                AND     [address1]      = @address1
                AND     [address2]      = @address2
                AND     [city]          = @city
                AND     [province_id]   = @province_id
                AND     [postal_code]   = @postalcode
                AND     [contact_phone] = @phone
                AND     [contact_fax]   = @fax
                AND     [deleted]       = dbo.pvd_fn_getDeletedDate(@id, @active))
        BEGIN
            SELECT 'update'
        END
        ELSE
        BEGIN
            SELECT 'no update'
        END

我基本上是想查看是否有任何列发生了变化,但是当@province_id 和 dbo.pvd_fn_getDeletedDate(@id, @active) 在数据库中为 NULL 并且都设置为 NULL 时,我遇到了问题.

省 ID 是一个 INT - 可空

Deleted 是一个日期时间 - 可以为空。

如果数据库中的记录对于这两个值都为 NULL,那么这将始终选择“更新”。这是错误的,因为 [province_id] 和 [deleted] 为 NULL。

在这种情况下如何处理 NULLS 有什么建议吗?

【问题讨论】:

    标签: sql sql-server-2005 tsql


    【解决方案1】:

    可以使用 ISNULL() 函数设置默认值吗?

        SELECT  *   
                    FROM    [tbl_web_company] 
                    WHERE   [name]          = @name
                    AND     [address1]      = @address1
                    AND     [address2]      = @address2
                    AND     [city]          = @city
                    AND     ISNULL([province_id],99999) = ISNULL(@province_id,99999)
                    AND     [postal_code]   = @postalcode
                    AND     [contact_phone] = @phone
                    AND     [contact_fax]   = @fax
                    AND     ISNULL([deleted], '1990-01-01') = ISNULL(dbo.pvd_fn_getDeletedDate(@id, @active), '1990-01-01')
        BEGIN
            SELECT 'update'
        END
        ELSE
        BEGIN
            SELECT 'no update'
        END
    

    使用 ISNULL() 会阻止优化器使用索引,所以通常我会建议不要这样做,但是这个查询的编写方式,如果它仍然使用索引,我会感到惊讶。

    【讨论】:

      【解决方案2】:

      使用 一片空白 反而 = 空

      【讨论】:

      • 如果使用参数而不是硬编码值,“IS NULL”是否可能?
      • 是这样吗?它对我不起作用。即使是这样,它也只有在参数为空时才有效(你不能说if @name is 'John')。那么使用参数就没有意义了。
      【解决方案3】:

      改用“IS NULL”:

      SELECT 'Is null' WHERE NULL = NULL
      

      不会返回任何行,但是:

      SELECT 'Is null' WHERE NULL IS NULL
      

      会...

      关于空值的好读物here

      【讨论】:

        【解决方案4】:

        由于您的值来自参数并且没有硬编码,您可以使用以下内容:

        ...
        AND ([province_id] IS NULL OR [province_id] = @province_id)
        ...
        

        对您的其他 NULLABLE 字段使用相同的结构。

        【讨论】:

          猜你喜欢
          • 2013-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多