Jak zrobić wiele warunków CASE WHEN przy użyciu programu SQL Server 2008?


173

To, co próbuję zrobić, to użyć więcej niż jednego warunku CASE WHEN dla tej samej kolumny.

Oto mój kod zapytania:

   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)

Jednak chciałbym użyć więcej niż jednego KIEDY dla tej samej kolumny „ilość”.

Jak w poniższym kodzie:

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

8
Czy coś w case when <condition> then <vaue> when <condition> then <value> . . . endtym nie działa?
Gordon Linoff

1
Jak mówił @GordonLinoff, możesz mieć więcej niż jeden WHEN.
Kermit

Jest dokładnie tak, jak mówisz. Umieściłem nawias w złym miejscu. Przepraszam chłopaki!
Nils Anders

Odpowiedzi:


389

Istnieją dwa formaty wyrażeń wielkości liter . Możesz zrobić CASEz wieloma, WHENjak;

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

Lub proste CASEwyrażenie

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

Lub CASE w obrębie CASE jako;

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
ISTNIEJĄ DWA. Wymienia trzy : D
d8aninja

Czy wewnętrzna wielkość liter jest weryfikowana, jeśli zewnętrzna wielkość liter nie zwraca prawdy?
ggderas

3
@ d8aninja Wymienili tylko 2. Trzecia jest kombinacją dwóch pierwszych, przy czym zewnętrzna obudowa jest pierwszego typu, a wewnętrzna - drugiego typu.
odlot

12

Po prostu użyj tego, musisz użyć więcej, gdy są to zajęcia.

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

Możesz użyć poniższego przykładu przypadku, gdy z wieloma warunkami.

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

Może to być skuteczny sposób wykonywania różnych testów na jednej instrukcji

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

działa to tylko w przypadku porównań równości!


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

5
Nie ma potrzeby zagnieżdżania wyrażeń CASES w ten sposób, możesz mieć wiele klauzul WHEN w jednym CASE.
Barmar

2
Kiedy pierwszy warunek jest spełniony, pozostałe warunki są ignorowane?
Niedziela,

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 

1
Proszę sformatować swoją odpowiedź i ewentualnie dodać wyjaśnienie.
tmt

0

Miałem podobny, ale chodziło o randki. Zapytanie pokazujące wszystkie pozycje z ostatniego miesiąca, działa świetnie bez warunków do stycznia. Do poprawnego działania potrzebne jest dodanie zmiennej roku i miesiąca

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)

Teraz po prostu dodaję zmienną do warunku: ...

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

0

Łącząc wszystkie warunki

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

Coś w tym stylu, dwa warunki, dwie kolumny

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

Po prostu potrzebujesz wielu, Whenaby pojedyncza skrzynka zachowywała się jakif.. Elseif else..

   Case when 1=1       //if
   Then
    When 1=1              //else if
     Then.... 
    When .....              //else if
    Then 
    Else                      //else
   ....... 
     End
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.