Как выполнить несколько условий CASE WHEN с использованием SQL Server 2008?

То, что я пытаюсь сделать, это использовать более одного условия 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".

Как и в следующем коде:

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

Ответ 1

Существуют два формата выражения case. Вы можете сделать CASE со многими WHEN как:

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 как;

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

Ответ 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

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 

Ответ 4

    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

Ответ 5

У меня был подобный, но он имел дело с датами. Запрос, чтобы показать все элементы за последний месяц, отлично работает без условий до января. Для правильной работы необходимо добавить переменную года и месяца

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)[email protected] and MONTH(creationtime)[email protected])

Ответ 6

Объединяя все условия

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 )                 
    )

Ответ 7

Это может быть эффективный способ выполнения различных тестов для одного оператора

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

это работает только при сравнении сравнений!