Столбец с нулевым значением и NOT EXISTS T-sql - PullRequest
3 голосов
/ 26 октября 2010

Я пытаюсь сделать следующее:

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 ,

Код провинции - INT - Nullable

Удалено Datetime - Nullable.

Если запись в базе данных имеет NULL для обоих этих значений, тогда всегда будет выбрано «обновить». Что неправильно, так как [провинция_идентификатор] и [удалено] равны NULL.

Любые предложения, как обрабатывать NULLS в этом случае?

Ответы [ 4 ]

4 голосов
/ 26 октября 2010

Можете ли вы использовать функцию 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 () не позволяет оптимизатору использовать индексы, поэтому обычно я бы советовал против этого, но какзапрос написан, я бы удивился, если бы он все равно использовал индекс.

3 голосов
/ 26 октября 2010

вместо этого используйте IS NULL = NULL

2 голосов
/ 26 октября 2010

Поскольку ваши значения получены из параметров и не имеют жесткого кодирования, вы можете использовать следующее:

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

Используйте ту же структуру для других NULLABLE полей.

2 голосов
/ 26 октября 2010

Вместо этого используйте «IS NULL»:

SELECT 'Is null' WHERE NULL = NULL

не будет возвращать никаких строк, но:

SELECT 'Is null' WHERE NULL IS NULL

будет ...

Хорошее чтениео нулях здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...