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

173

Я пытаюсь использовать более одного условия 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
Нильс Андерс
источник
8
Есть что-то, case when <condition> then <vaue> when <condition> then <value> . . . endчто не работает?
Гордон Линофф
1
Как говорил @GordonLinoff, вы можете иметь более одного WHEN.
Кермит
Это именно так, как вы говорите. Я поставил скобку не в том месте. Извините ребята!
Нильс Андерс

Ответы:

390

Существует два формата выражения регистра . Вы можете сделать 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
Каф
источник
30
ЕСТЬ ДВА. Списки три : D
d8aninja
Проверяется ли внутренний регистр, если внешний регистр не возвращает true?
ggderas
3
@ d8aninja Они только перечислили 2. Третий - комбинация первых двух, с внешним типом, являющимся первым типом и внутренним регистром, являющимся вторым типом.
пролетает
12

Просто используйте этот, Вы должны использовать больше, когда они являются классами.

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
Абхиджит Навгире
источник
2

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

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

это работает только на сравнениях равенства!

user2082785
источник
1
    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
Jimoc
источник
5
Нет необходимости вкладывать выражения CASES, подобные этому, вы можете иметь несколько предложений WHEN в одном CASE.
Бармар
2
Когда первое условие выполнено, остальные условия игнорируются?
Вс
1
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 
wennykikkok
источник
1
Пожалуйста, отформатируйте свой ответ и, возможно, добавьте пояснения.
TMT
0

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

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)
Дуглас Бентли
источник
0

Сочетая все условия

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 )                 
    )
Арун Прасад Е.С.
источник
0

Примерно так: два условия, два столбца

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
Рикардо Роа
источник
0

Это просто, что вам нужно несколько Whenдля одного случая, чтобы вести себя какif.. Elseif else..

   Case when 1=1       //if
   Then
    When 1=1              //else if
     Then.... 
    When .....              //else if
    Then 
    Else                      //else
   ....... 
     End
Химаншу Ахуджа
источник