Не удается обновить таблицу при сравнении значения со значением NULL - PullRequest
1 голос
/ 01 апреля 2020

У меня есть #tempTable, которая содержит все необходимые данные, которые я хочу использовать для обновления существующей таблицы:

UPDATE [BED].[Import].[InStore]
SET 
    A.Size = B.Size
    A.ProdDate = B.ProdDate
FROM [BED].[Import].[InStore] As A
    INNER JOIN #tmpTable as B
    ON A.Source = B.Source
    AND A.Location = B.Location
    AND A.Market = B.Market
    WHERE B.Location IS NOT NULL

Но после добавления этой строки в самом конце ничего не обновляется:

AND (A.Size <> B.Size OR A.ProdDate <> B.ProdDate)

Столбцы A.Size и A.ProdDate имеют значение NULL в существующей таблице, а B.Size и B.ProdDate в #tmpTable имеют значения, такие как «King» и «2020-01-01». Как я могу убедиться, что обновил значения, которые имеют значение NULL, в существующей таблице, если AND (A.Size <> B.Size OR A.ProdDate <> B.ProdDate) не работает?

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

3 голосов
/ 01 апреля 2020

У вас есть NULL значения. Почти любая операция - включая сравнения - возвращает NULL. И они рассматриваются как «ложные».

Итак, ваша логика c должна быть более многословной:

AND ( A.Size <> B.Size OR
      A.Size IS NOT NULL AND B.Size IS NULL OR
      A.Size IS NULL and B.SIZE IS NOT NULL OR
      A.ProdDate <> B.ProdDate OR
      A.ProdDate IS NOT NULL AND B.ProdDate IS NULL OR
      A.ProdDate IS NULL AND B.ProdDate IS NOT NULL
     )

К сожалению, SQL Сервер не поддерживает IS DISTINCT FROM, стандартный NULL безопасный оператор сравнения.

1 голос
/ 01 апреля 2020

Если вы всегда хотите обновить таблицу A, когда Size или ProdDate равны NULL, вы можете использовать это в предложении where:

AND (A.Size <> B.Size OR A.ProdDate <> B.ProdDate OR A.Size IS NULL OR A.ProductDate IS NULL)

Если Size и ProdDate таблицы B равны NULL, тогда и вы хотите, чтобы они перезаписывали значения в таблице A, тогда вам потребуется другой подход. Вы можете использовать функцию COALESCE, чтобы изменить значения NULL на нечто сопоставимое:

AND (COALESCE(A.Size,-1) <> COALESCE(B.Size,-1) OR COALESCE(A.ProdDate,'1990-01-01') <> COALESCE(B.ProdDate,'1990-01-01'))

Если вы используете метод COALESCE, вам нужно обратить внимание на типы данных и ожидаемые значения в таблице. Вы не хотите объединять значения NULL со значениями, которые встречаются в вашей таблице, потому что тогда они не будут помечены как «разные» в предложении WHERE.

Вам также следует прочитать о сервере SQL Параметр ANSI_NULLS, поскольку это изменит поведение ваших сравнений NULL.

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