【问题标题】:How to filter data of CASE WHEN statement using where condition?如何使用 where 条件过滤 CASE WHEN 语句的数据?
【发布时间】:2019-06-10 18:07:34
【问题描述】:

在盟军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 条件称为“操作”,现在我只想在“操作”列中查看操作“X”。

有没有办法在 SSMS 2012 中使用 where 子句过滤 CASE WHEN 条件?

【问题讨论】:

  • 为什么不直接WHERE Number LIKE '20%'?并且由于您过滤了结果集,因此您不需要 CASE 表达式,只需 'X' AS Operation
  • 我实际上有多个 CASE WHEN 语句,但是使用 Number 作为过滤条件也很有效且简单。谢谢@Sami

标签: sql sql-server tsql ssms ssms-2012


【解决方案1】:

将您的查询包装成一个派生表,然后您可以将新列放在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'

【讨论】:

  • 只需Operation = 'X'
【解决方案2】:

你可以使用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%' 就可以了。

【讨论】:

    【解决方案3】:

    加上你要应用的条件,你的语句相当于:

    SELECT 'X' AS Operation, *
    FROM 
    TableA
    where Number like '20%'
    

    【讨论】:

    • Aaaah 不错的一个 forpas :D
    【解决方案4】:

    只是另一种选择

    使用 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';
    

    现在,让我们看看your last comment

    我实际上有多个 CASE WHEN 语句,但是使用 Number 作为过滤条件也可以工作且简单。

    好吧,Number 列不需要CASE 表达式

    SELECT 'X' Operation,
           --Another CASE here if needed
           ,*
    FROM 
    TableA
    WHERE Number like '20%';
    

    【讨论】:

      【解决方案5】:

      您必须在 WHERE 子句中重复 CASE 表达式,或者将其嵌套在另一个 SELECT 语句中。

      【讨论】:

        【解决方案6】:

        您不能在 where ondition 中使用列别名 .. 如果需要,您可以使用 have(适用于结果值或子查询)

        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'
        

        否则你应该在 where 子句中为 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 like 'X'
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-05-05
          • 1970-01-01
          • 2023-01-21
          • 1970-01-01
          相关资源
          最近更新 更多