【问题标题】:How do I do multiple CASE WHEN conditions using SQL Server 2008?如何使用 SQL Server 2008 执行多个 CASE WHEN 条件?
【发布时间】:2013-01-15 20:40:26
【问题描述】:

我要做的是对同一列使用多个 CASE WHEN 条件。

这是我的查询代码:

   SELECT   Url='',
            p.ArtNo,
            p.[Description],
            p.Specification,
            CASE 
            WHEN 1 = 1 or 1 = 1 
               THEN 1 
               ELSE 0 
            END as Qty,
            p.NetPrice,
            [Status] = 0
      FROM  Product p (NOLOCK)

但是,我想做的是对同一列“qty”使用多个 WHEN。

如下代码:

IF
// CODE
ELSE IF
// CODE
ELSE IF
// CODE
ELSE
// CODE

【问题讨论】:

  • case when <condition> then <vaue> when <condition> then <value> . . . end 有什么不工作的地方吗?
  • 正如@GordonLinoff 所说,您可以拥有多个WHEN
  • 正如你所说。我把括号放错地方了。对不起各位!

标签: sql sql-server-2008


【解决方案1】:

two formats of case expression。你可以用很多WHENCASE

CASE  WHEN Col1 = 1 OR Col3 = 1  THEN 1 
      WHEN Col1 = 2 THEN 2
      ...
      ELSE 0 END as Qty

或者一个简单的CASE 表达式

CASE Col1 WHEN 1 THEN 11 WHEN 2 THEN 21 ELSE 13 END

或者 CASE CASE as;

CASE  WHEN Col1 < 2 THEN  
                    CASE Col2 WHEN 'X' THEN 10 ELSE 11 END
      WHEN Col1 = 2 THEN 2
      ...
      ELSE 0 END as Qty

【讨论】:

  • 有两个。 列出三个 :D
  • 如果外部情况不返回 true,是否正在验证内部情况?
  • @d8aninja 他们只列出了2个。第3个是前两个的组合,外壳是第一种,内壳是第二种。
【解决方案2】:

就用这个吧,当他们是类的时候你必须使用更多。

SELECT   Url='',
         p.ArtNo,
         p.[Description],
         p.Specification,
         CASE 
         WHEN 1 = 1 or 1 = 1 
            THEN 1 
         WHEN 2 = 2
             THEN 2
         WHEN 3 = 3
              THEN 3
          ELSE 0 
        END as Qty,
        p.NetPrice,
        [Status] = 0
  FROM  Product p (NOLOCK)

【讨论】:

    【解决方案3】:

    当有多个条件时,您可以使用下面的案例示例。

    SELECT
      id,stud_name,
      CASE
        WHEN marks <= 40 THEN 'Bad'
        WHEN (marks >= 40 AND
          marks <= 100) THEN 'good'
        ELSE 'best'
      END AS Grade
    FROM Result
    

    【讨论】:

      【解决方案4】:

      类似这样,两个条件两列

      SELECT ITEMSREQ.ITEM AS ITEM,
             ITEMSREQ.CANTIDAD AS CANTIDAD,
             (CASE  WHEN ITEMSREQ.ITEMAPROBADO=1 THEN 'APROBADO'
                    WHEN ITEMSREQ.ITEMAPROBADO=0 THEN 'NO APROBADO'
              END) AS ITEMS,
              (CASE 
                    WHEN ITEMSREQ.ITEMAPROBADO = 0 
                    THEN CASE WHEN REQUISICIONES.RECIBIDA IS NULL  THEN 'ITEM NO APROBADO PARA ENTREGA' END
                    WHEN ITEMSREQ.ITEMAPROBADO = 1 
                    THEN CASE WHEN REQUISICIONES.RECIBIDA IS NULL THEN 'ITEM AUN NO RECIBIDO' 
                              WHEN REQUISICIONES.RECIBIDA=1 THEN 'RECIBIDO' 
                              WHEN REQUISICIONES.RECIBIDA=0 THEN 'NO RECIBIDO' 
                             END
                    END)
                    AS RECIBIDA
       FROM ITEMSREQ
            INNER JOIN REQUISICIONES ON
            ITEMSREQ.CNSREQ = REQUISICIONES.CNSREQ
      

      【讨论】:

        【解决方案5】:
        case 
            when a.REASONID in ('02','03','04','05','06') then
                case b.CALSOC 
                    when '1' then 'yes' 
                    when '2' then 'no' 
                    else 'no' 
                end
            else 'no' 
        end 
        

        【讨论】:

        • 请格式化您的答案并可能添加一些解释。
        【解决方案6】:

        这可能是对单个语句执行不同测试的有效方法

        select
        case colour_txt 
          when 'red' then 5 
          when 'green' then 4 
          when 'orange' then 3
        else 0 
        end as Pass_Flag
        

        这仅适用于相等比较!

        【讨论】:

          【解决方案7】:
              case when first_condition
                then first_condition_result_true
              else
                case when second_condition 
                  then second_condition_result_true
                else
                    second_condition_result_false                              
                end
              end
            end as qty
          

          【讨论】:

          • 没有必要像这样嵌套 CASES 表达式,一个 CASE 中可以有多个 WHEN 子句。
          • 满足第一个条件时,忽略其余条件?
          【解决方案8】:

          只是你需要多个When 来让单个案例表现得像if.. Elseif else..

             Case when 1=1       //if
             Then
              When 1=1              //else if
               Then.... 
              When .....              //else if
              Then 
              Else                      //else
             ....... 
               End
          

          【讨论】:

            【解决方案9】:

            我也有类似的情况,但它正在处理日期。 查询显示上个月的所有项目,在 1 月之前无条件运行良好。 为了让它正常工作,需要添加一个年月变量

            declare @yr int
            declare @mth int
            
            set @yr=(select case when month(getdate())=1 then YEAR(getdate())-1 else YEAR(getdate())end)
            set @mth=(select case when month(getdate())=1 then month(getdate())+11 else month(getdate())end)
            

            现在我只是将变量添加到条件中: ...

            (year(CreationTime)=@yr and MONTH(creationtime)=@mth)
            

            【讨论】:

              【解决方案10】:

              结合所有条件

              select  a.* from tbl_Company a
              
              where  a.Company_ID NOT IN (1,2)  
              
              AND (   
                      (0 = 
                          CASE WHEN (@Fromdate = '' or @Todate='')
                              THEN 0 
                              ELSE 1  
                          END
                      )      -- if 0=0 true , if 0=1 fails (filter only when the fromdate and todate is present)
                              OR
                      (a.Created_Date between @Fromdate and @Todate )                 
                  )
              

              【讨论】:

                猜你喜欢
                • 2023-01-09
                • 1970-01-01
                • 1970-01-01
                • 2021-11-04
                • 2017-04-20
                • 1970-01-01
                • 2023-04-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多