SQL UPDATE на основе условий других столбцов

115
14

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

UPDATE account
SET new_finalleadsource =

CASE WHEN
new_jtrack_source IS NOT NULL AND new_jtracksource <> ''
THEN new_jtrack_source

CASE WHEN
new_jtrackofflinesource IS NOT NULL AND new_jtrackofflinesource <> ''
THEN new_jrackofflinesource

CASE WHEN
new_leadsource IS NOT NULL AND new_leadsource <> ''
THEN new_leadsource

ELSE NULL
END

Не уверен, что случай можно использовать таким образом, я в основном пытаюсь обновить столбец со значением из одного из трех других столбцов в зависимости от первого, у которого есть данные.

благодаря

спросил(а) 2021-01-19T22:37:36+03:00 2 месяца, 3 недели назад
1
Решение
61

Да. Однако, если вы не хотите изменять значение, измените значение else на else new_finalleadsource.

Один из способов написать выражение:

UPDATE account
SET new_finalleadsource = (CASE WHEN new_jtrack_source IS NOT NULL AND new_jtracksource <> ''
THEN new_jtrack_source

WHEN new_jtrackofflinesource IS NOT NULL AND new_jtrackofflinesource <> ''
THEN new_jrackofflinesource
WHEN new_leadsource IS NOT NULL AND new_leadsource <> ''
THEN new_leadsource
ELSE NULL
END);

Альтернативой является использование COALESCE() и NULLIF():

UPDATE account
SET new_finalleadsource = COALESCE(NULLIF(new_jtrack_source, ''),
NULLIF(new_jrackofflinesource, ''),
NULLIF(new_leadsource, '')
);

ответил(а) 2021-01-19T22:37:36+03:00 2 месяца, 3 недели назад
61

Это не так, как работает оператор case. Утверждение дела похоже на серию проверок КОГДА. Похоже на C-переключатель с перерывом перед каждым КОГДА. Так что вы хотите

UPDATE account
SET new_finalleadsource =
CASE
WHEN new_jtrack_source IS NOT NULL AND new_jtracksource <> '' THEN new_jtrack_source
WHEN new_jtrackofflinesource IS NOT NULL AND new_jtrackofflinesource <> '' THEN new_jrackofflinesource
WHEN new_leadsource IS NOT NULL AND new_leadsource <> '' THEN new_leadsource
ELSE NULL
END

Я думаю, что следующее (основанное на ответе Гордона) является наиболее надежным решением:

UPDATE account
SET new_finalleadsource =
COALESCE(NULLIF(LTRIM(RTRIM(new_jtrack_source)), ''),
NULLIF(LTRIM(RTRIM(new_jrackofflinesource)), ''),
NULLIF(LTRIM(RTRIM(new_leadsource)), '')
);

ответил(а) 2021-01-19T22:37:36+03:00 2 месяца, 3 недели назад
62

Вам не нужно несколько операторов CASE, вместо этого используйте один оператор Case с несколькими выражениями WHEN

Попробуйте этот путь

UPDATE account 
SET new_finalleadsource = CASE
WHEN new_jtrack_source IS NOT NULL
AND new_jtracksource <> '' THEN new_jtrack_source
WHEN new_jtrackofflinesource IS NOT NULL
AND new_jtrackofflinesource <> '' THEN new_jrackofflinesource
WHEN new_leadsource IS NOT NULL
AND new_leadsource <> '' THEN new_leadsource
ELSE NULL
END

ответил(а) 2021-01-19T22:37:36+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема