У меня есть представление, которое имеет сложный оператор CASE для определения значения одного из столбцов.Проверьте, является ли значение столбца равным нулю MS SQL Server
SELECT a.itemcode, count(*) total, b.foo
CASE
WHEN foo IN ('aab', 'aac')
THEN 1
WHEN foo IN ('qqq', 'fff')
THEN 2
WHEN foo IN ('foo', 'bar')
THEN 10 % count(*)
ELSE 9 % count(*)
END AS other_total
FROM a INNER JOIN b ON a.itemcode = b.itemcode
GROUP BY itemcode, foo
Я хочу добавить чек на значение столбца other_total. Если это 0
, я хочу установить значение 1
.
Очевидно, что я мог бы окружить все это в CASE
заявления ...
CASE (CASE
WHEN foo IN ('aab', 'aac')
THEN 1
WHEN foo IN ('qqq', 'fff')
THEN 2
WHEN foo IN ('foo', 'bar')
THEN 10 % count(*)
ELSE 9 % count(*)
END)
WHEN 0 THEN 1
ELSE CASE
WHEN foo IN ('aab', 'aac')
THEN 1
WHEN foo IN ('qqq', 'fff')
THEN 2
WHEN foo IN ('foo', 'bar')
THEN 10 % count(*)
ELSE 9 % count(*)
END
END AS other_total
Но это лишь немного грязная и кажется, что там должно быть более простым способом.
Есть ли другая функция, аналогичная ISNULL()
, что позволило бы мне изменить значение столбца, если оно равно нулю?
ОТВЕТ
Благодаря ответ gofr1, я был в состоянии работать этот. Я использовал функцию NULLIF для возврата NULL, если оператор case был равен 0, а затем окружен функцией ISNULL, чтобы установить значение 1, если функция NULLIF возвращает NULL.
SELECT a.itemcode, count(*) total, b.foo,
ISNULL (
NULLIF (
CASE
WHEN foo IN ('aab', 'aac')
THEN 1
WHEN foo IN ('qqq', 'fff')
THEN 2
WHEN foo IN ('foo', 'bar')
THEN 10 % count(*)
ELSE 9 % count(*)
END
), 0)
), 1) other_total
FROM a INNER JOIN b ON a.itemcode = b.itemcode
GROUP BY itemcode, foo
Спасибо - я изменил внешний оператор CASE на ISNULL, который отсортировал его – ryansin
Мое удовольствие помочь! ;) – gofr1