2016-02-18 2 views
0

Можно ли вернуть ноль, если значение меньше нуля, без использования оператора case?Возврат нуля, если значение меньше нуля

например. Max (a, 0) < - «Макс» не существует.

Я хочу, чтобы мой код был максимально кратким.

+6

Почему вы не хотите использовать выражение случая. Это в значительной степени то, для чего они были сделаны. –

+0

Его в вопросе! –

+0

Также смотрите: [Функция в SQL Server 2008 похожа на GREATEST в mysql?] (Http://stackoverflow.com/questions/4725823/function-in-sql-server-2008-similar-to-greatest-in-mysql) –

ответ

12

Просто для удовольствия:

DECLARE @a INT = -3 
SELECT COALESCE(NULLIF (ABS(@a), [email protected]), 0) 

Это сообщение только намекает в направлении, что выражение CASE является гораздо лучшим вариантом, чтобы получить ожидаемый результат.

NULLIF есть, в конце концов, всего лишь причуда CASE. Пример запрос выше расширяется (в плане выполнения) по адресу:

CASE 
    WHEN 
     CASE 
      WHEN abs([@a])=(-[@a]) 
      THEN NULL 
      ELSE abs([@a]) 
     END IS NOT NULL 
    THEN 
     CASE 
      WHEN abs([@a])=(-[@a]) 
      THEN NULL 
      ELSE abs([@a]) 
     END 
    ELSE (0) 
END 

Подходящего CASE выражения:

-- All versions 
SELECT CASE WHEN @a > 0 THEN @a ELSE 0 END; 

-- SQL Server 2012 or later 
SELECT IIF(@a > 0, @a, 0); 
+0

@PaulWhite: вот еще одна причина использовать эту простую версию: 'SELECT CASE WHEN @a <0 THEN 0 ELSE @a END' –

+1

@TimSchmelter Да, будьте осторожны, чтобы правильно обращаться с« NULL ». (Я предполагаю, что результат должен быть 0, а не 'NULL'). –

+0

Альтернативное выражение, которое обрабатывает NULL: '@A * ((Sign (@A) + 1)/2)' – HABO

Смежные вопросы