空值列和NOT EXISTS T-sql

时间:2010-10-26 13:13:46

标签: sql sql-server-2005 tsql

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

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 - Nullable

已删除是Datetime - Nullable。

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

在这种情况下如何处理NULLS的任何建议?

4 个答案:

答案 0 :(得分:4)

您可以使用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()可以防止优化器使用索引,所以通常我会建议不要这样做,但是这个查询的写法,如果它正在使用索引,我会感到惊讶。

答案 1 :(得分:3)

使用 一片空白 代替 = NULL

答案 2 :(得分:2)

改为使用“IS NULL”:

SELECT 'Is null' WHERE NULL = NULL

没有返回任何行,但是:

SELECT 'Is null' WHERE NULL IS NULL

将...

关于空值here

的好读物

答案 3 :(得分:2)

由于您的值来自参数且未经过硬编码,因此您可以使用以下内容:

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

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