2016-10-25 5 views
1

У меня есть представление, которое имеет сложный оператор 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 

ответ

1

Вы можете использовать NULLIF

Возвращает нулевое значение, если два указанных выражения равны.

CASE WHEN 
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) IS NULL THEN 0 ELSE 1 END 
AS other_total 

Если значение = 0 то становится NULL иначе значение на выходе. Затем мы используем CASE WHEN value IS NULL then 0 else 1.

+0

Спасибо - я изменил внешний оператор CASE на ISNULL, который отсортировал его – ryansin

+0

Мое удовольствие помочь! ;) – gofr1

0

использование DERIVED QUERY или КТР

- производный запрос

SELECT itemcode, total, foo, case when other_total = 0 then 1 else other_total end as other_total 
FROM 
(
    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 
) d 

ИЛИ

вы можете просто использовать СЛУЧАЙ на последних 2 выражение случай, когда ... так это единственные 2 места, которые предоставят вам 0.

WHEN foo IN ('foo', 'bar') 
    THEN CASE WHEN 10 % count(*) = 0 THEN 1 ELSE 10 % count(*) END 
    ELSE CASE WHEN 9 % count(*) = 0 THEN 1 ELSE 9 % count(*) END 
    END AS other_total 
2
SELECT NullIf(<your_code>, 0) AS zero_to_null 
    , Coalesce(NullIf(<your_code>, 0), 1) AS zero_to_null_to_one 

или

SELECT CASE WHEN other_total = 0 THEN 1 ELSE other_total END AS new_total 
FROM (
     <your_code> 
     ) AS a_subquery 
Смежные вопросы