Как отфильтровать данные оператора CASE WHEN, используя условие where?
После союзников CASE WHEN условие как столбец мы можем отфильтровать этот столбец?
Пример;
SELECT
CASE WHEN Number like '20%' THEN 'X'
WHEN Number like '15%' or Number like '16%' THEN 'Y' ELSE 'Z'
END Operation
,*
FROM
TableA
where Operation like 'X'
Я назвал условие CASE WHEN как "Операция", и теперь я хочу видеть только операцию "Х" в столбце "Операция".
Есть ли способ отфильтровать условие CASE WHEN с предложением where в SSMS 2012?
6 ответов
Сверните ваш запрос как производную таблицу, тогда вы можете поместить новый столбец в WHERE
пункт:
select *
from
(
SELECT
CASE WHEN Number like '20%' THEN 'X'
WHEN Number like '15%' or [Item Number] like '16%' THEN 'Y' ELSE 'Z'
END Operation
,*
FROM
TableA
) dt
where Operation like 'X'
Ты можешь использовать APPLY
:
SELECT A.*, AA.*
FROM TableA AS A CROSS APPLY
( VALUES (CASE WHEN Number like '20%'
THEN 'X'
WHEN (Number like '15%' OR [Item Number] like '16%')
THEN 'Y' ELSE 'Z'
END )
) AA(Operation)
WHERE AA.Operation = 'X';
Это было бы полезно, если у вас есть и другие фильтры. Однако только WHERE Number LIKE '20%'
это просто хорошо.
С условием, которое вы хотите применить, ваше утверждение эквивалентно:
SELECT 'X' AS Operation, *
FROM
TableA
where Number like '20%'
Просто другие варианты
Использование CTE
WITH CTE AS
(
SELECT
CASE WHEN Number like '20%' THEN 'X'
WHEN Number like '15%' or Number like '16%' THEN 'Y' ELSE 'Z'
END Operation
,*
FROM
TableA
)
SELECT *
FROM CTR
WHERE Operation = 'X';
Использование выражения CASE
SELECT
CASE WHEN Number like '20%' THEN 'X'
WHEN Number like '15%' or Number like '16%' THEN 'Y' ELSE 'Z'
END Operation
,*
FROM
TableA
WHERE CASE WHEN Number like '20%' THEN 'X'
WHEN Number like '15%' or Number like '16%' THEN 'Y'
ELSE 'Z'
END = 'X';
Теперь давайте посмотрим ваш последний комментарий
На самом деле у меня есть несколько операторов CASE WHEN, но да, использование Number в качестве условия фильтра также работает и просто.
Хорошо, тебе не нужен CASE
выражение для Number
колонка
SELECT 'X' Operation,
--Another CASE here if needed
,*
FROM
TableA
WHERE Number like '20%';
Вы должны повторить CASE
Выражение в предложении WHERE или вложите его в другой оператор SELECT.
Вы не можете использовать псевдоним столбца, где ondition .. если вам нужно, вы можете использовать наличие (это работает на значениях результата или подзапрос)
SELECT
CASE WHEN Number like '20%' THEN 'X'
WHEN Number like '15%' or Number like '16%' THEN 'Y' ELSE 'Z'
END Operation
,*
FROM TableA
HAVING Operation like 'X'
подзапрос и где
select operation from (
SELECT
CASE WHEN Number like '20%' THEN 'X'
WHEN Number like '15%' or Number like '16%' THEN 'Y' ELSE 'Z'
END Operation
,*
FROM TableA
) t
where operation = 'X'
в противном случае вы должны использовать один и тот же код для case в предложении where
SELECT
CASE WHEN Number like '20%' THEN 'X'
WHEN Number like '15%' or Number like '16%' THEN 'Y' ELSE 'Z'
END Operation
,*
FROM TableA
WHERE CASE WHEN Number like '20%' THEN 'X'
WHEN Number like '15%' or Number like '16%' THEN 'Y' ELSE 'Z'
END like 'X'