Использовать контрольные знаки внутри оператора sql case

Я ищу способ создания операторов case в запросе select sql, использующем меньше и больше знаков. Например, я хочу выбрать ранжирование на основе переменной:

DECLARE @a INT
SET @a = 0

SELECT CASE 
         WHEN @a < 3 THEN 0
         WHEN @a = 3 THEN 1
         WHEN @a > 3 THEN 2
       END

Я хотел бы написать это как:

DECLARE @a INT
SET @a = 0

SELECT CASE @a
         WHEN < 3 THEN 0
         WHEN 3 THEN 1
         WHEN > 3 THEN 2
       END

... но SQL не позволяет мне использовать < и > знаки таким образом. Есть ли способ, которым я могу это сделать, это SQL 2005, или мне нужно использовать код, как в первом.

Причина, по которой только один раз нужен код, заключается в том, что код сделает намного более удобочитаемым/поддерживаемым, а также потому, что я не уверен, что SQL-серверу придется запускать расчет для каждого оператора CASE.

Я ищу аргумент case VB.NET equivelent:

Select Case i
    Case Is < 100
        p = 1
    Case Is >= 100
        p = 2
End Select

Возможно, это невозможно в SQL, и это нормально, я просто хочу подтвердить это.

Ответы

Ответ 1

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

DECLARE @a INT
SET @a = 0

SELECT CASE SIGN(@a - 3)
         WHEN -1 THEN 0
         WHEN 0 THEN 1
         WHEN 1 THEN 2
       END

Если @a меньше 3, то @a - 3 приводит к отрицательному int, в котором SIGN возвращает -1.

Если @a равно 3 или больше, тогда SIGN возвращает 0 или 1 соответственно.


Если требуемый результат - 0, 1 и 2, вы можете упростить еще больше:

DECLARE @a INT
SET @a = 0

SELECT SIGN(@a - 3) + 1

Ответ 2

Использование SIGN в качестве предложенное @Jose Rui Santos, кажется приятным обходным решением. Альтернативой может быть присвоение выражения псевдонимам, использование подзапроса и проверка выражения (используя его псевдоним) во внешнем выборе:

SELECT
  …,
  CASE
    WHEN expr < 3 THEN …
    WHEN expr > 3 THEN …
  END AS …
FROM (
  SELECT
    …,
    a complex expression AS expr
  FROM …
  …
)

Ответ 3

SELECT 
CASE 
WHEN ColumnName >=1 and ColumnName <=1 THEN 'Fail'
WHEN ColumnName >=6 THEN 'Pass'
ELSE 'Test'
END
FROM TableName