Оператор условного обновления, возвращающий неверные результаты на SQL Server 2012 - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь обновить таблицу в SQL Server 2012 Management Studio. Вместо того чтобы писать четыре отдельных оператора Update, я пытаюсь выяснить, возможно ли написать один запрос, который обновит одну и ту же таблицу для одного столбца четырьмя различными способами в зависимости от того, какое значение столбца хранится.

Предположим, у меня есть таблица с именем table_food со следующей структурой

|Customer|Preference|
+--------+----------+
|John    |McDs      |
|Div     |KFC       |
|Paul    |KFC       |
|Pablo   |Wasabi    |

Моя идея состоит в том, чтобы обновить столбец Preference до новых значений, и запрос, который я написал, был:

UPDATE table_food
SET Preference = 
    CASE WHEN Preference = 'McDs' Then 'Burger'
         WHEN Preference = 'KFC' Then 'KingsMeal'
    END

Теперь в моей фактической таблице для предпочтения выбрано только 8 различных опций, и мне просто нужно два обновления 4. (Я только что сделал два в качестве примера выше, но у меня есть четыре утверждения когда ... так что простоеще две строки)

Когда я запускаю запрос, он показывает гораздо больше строк, на которые влияют, и проверяет результаты после того, как я заметил, что теперь есть только одна опция, показанная «Burger» со счетчиком 8, и все остальные строки былиустановите на null. Я что-то упускаю?

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

добавьте else в свой оператор case.

UPDATE table_food
SET Preference = 
    CASE WHEN Preference = 'McDs' Then 'Burger'
         WHEN Preference = 'KFC' Then 'KingsMeal'
    ELSE Preference 
    END

или, если вы хотите обновить только затронутые строки, вы делаете update from

UPDATE table_food
SET Preference = t2.newPreference
FROM
    (SELECT CASE WHEN Preference = 'McDs' Then 'Burger'
                WHEN Preference = 'KFC' Then 'KingsMeal'
                WHEN Preference = 'KFC1' Then 'KingsMeal1'
                WHEN Preference = 'KFC'2 Then 'KingsMeal2'
            END as newPreference, Preference
    FROM table_food) t2
WHERE t2.Preference = table_food.Preference and coalesce(t2.newPreference, '') != ''
2 голосов
/ 06 ноября 2019

Этот запрос будет обновлять каждую строку в вашей таблице, поскольку в нем отсутствует предложение WHERE. И выражение CASE WHEN возвращает NULL, если ни одно из условий WHEN не выполняется. Вы можете захотеть запрос как:

UPDATE table_food
SET Preference = 
    CASE WHEN Preference = 'McDs' Then 'Burger'
         WHEN Preference = 'KFC' Then 'KingsMeal'
    END
WHERE Preference in ('McDs','KFC')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...