Один метод использует NULLIF()
:
SELECT COALESCE(NULLIF(qa2.AcceptedAnswer, 0), qa.AcceptedAnswer) as AcceptedAnswer
FROM qanda;
Лично я предпочитаю выражение CASE
, потому что считаю его намерение более явным:
select (case when qa2.AcceptedAnswer <> 0 then qa2.AcceptedAnswer
else qa.AcceptedAnswer
end) as AcceptedAnswer
Обратите внимание, что явное сравнение NULL
не требуется; <>
позаботится об этом.
@MartinAJ: nullif (0, 0)
дает NULL
, поэтому coalesce(nullif (0, 0), 1)
= coalesce(NULL, 1)
возвращает 1
, а не 0
. Вы можете спутать nullif ()
с ifnull()
(обратите внимание на разные позиции «если» в именах функций.).
Нет, первое решение @Gordon правильное. «Если qa2 равно нулю, рассматривать его как NULL». Если qa2 = 0 и qa = 1, первое слияние будет COALESCE (NULL, 1) = 1.
Вы можете записать CASE WHEN
в функции COALESCE
.
SELECT COALESCE(CASE WHEN qa2.AcceptedAnswer<> 0 THEN qa2.AcceptedAnswer END
,CASE WHEN qa.AcceptedAnswer <> 0 THEN qa.AcceptedAnswer END)
FROM T
Ваше первое решение неверно. Поскольку
SELECT COALESCE(0, 1)
возвращает0
. Хотя в моем вопросе написано «Мне нужно вести себя с0
как сNULL
, поэтому0
следует игнорировать»