Как отфильтровать данные оператора 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'
Другие вопросы по тегам