Как отфильтровать данные оператора CASE WHEN, используя условие where? - PullRequest
0 голосов
/ 16 января 2019

После того, как союзники ПРИМЕРЯЛИ КОГДА при условии, что в качестве столбца можно отфильтровать этот столбец?

Пример;

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 ]

0 голосов
/ 16 января 2019

Просто еще один вариант

Использование 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%';
0 голосов
/ 16 января 2019

вы не можете использовать псевдоним столбца в условии 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'

в противном случае вы должны повторно использовать тот же код для случая, в котором пункт

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'
0 голосов
/ 16 января 2019

С условием, которое вы хотите применить, ваше заявление эквивалентно:

SELECT 'X' AS Operation, *
FROM 
TableA
where Number like '20%'
0 голосов
/ 16 января 2019

Вы можете использовать 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%' просто отлично.

0 голосов
/ 16 января 2019

Вы должны повторить выражение CASE в предложении WHERE или вложить его в другой оператор SELECT.

0 голосов
/ 16 января 2019

Сверните ваш запрос как производную таблицу , тогда вы можете поместить новый столбец в предложение 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'
...