SQL Server 2008 kullanarak birden çok CASE WHEN koşulunu nasıl yapabilirim?


173

Ne yapmaya çalışıyorum aynı sütun için birden fazla durumda ne zaman koşulunu kullanmaktır.

İşte sorgu için benim kod:

   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)

Ancak, ne yapmak istiyorum aynı sütun "adet" için birden fazla ne zaman kullanmaktır.

Aşağıdaki kodda olduğu gibi:

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

8
Bunun case when <condition> then <vaue> when <condition> then <value> . . . endişe yaramadığı bir şey var mı ?
Gordon Linoff

1
@GordonLinoff'un dediği gibi, birden fazla olabilir WHEN.
Kermit

Aynen dediğin gibi. Yanlış yere bir parantez koydum. Üzgünüm beyler!
Nils Anders

Yanıtlar:


390

Vaka ifadesinin iki biçimi vardır . CASEBirçokları ile yapabilirsiniz WHEN;

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

Veya Basit bir CASEifade

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

Veya CASE içinde 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
İKİ TANE. Üç
liste

Dış kasa doğru dönmezse iç kasa doğrulanıyor mu?
ggderas

3
@ d8aninja Sadece 2'yi listelediler. Üçüncüsü ilk ikisinin birleşimidir, dış kasa birinci tip ve iç kasa ikinci tiptir.
Eylül'de

12

Sadece bunu kullanın, ders olduklarında daha fazla kullanmalısınız.

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

Birden fazla koşulda aşağıdaki durum örneğini kullanabilirsiniz.

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

Bu, tek bir ifadede farklı testler gerçekleştirmenin etkili bir yolu olabilir

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

bu sadece eşitlik karşılaştırmaları üzerinde çalışır!


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
Bunun gibi CASES ifadelerini iç içe yerleştirmeye gerek yoktur, tek bir CASE içinde birden fazla WHEN yan tümcesi olabilir.
Barmar

2
İlk koşul karşılandığında, koşulların geri kalanı yok sayılır mı?
Paz

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
Lütfen yanıtınızı biçimlendirin ve muhtemelen bir açıklama ekleyin.
tmt

0

Benzer bir şey vardı ama tarihlerle uğraşıyordu. Geçen aya ait tüm öğeleri gösterme sorgusu, Ocak ayına kadar şartlar olmadan harika çalışıyor. Doğru çalışması için bir yıl ve ay değişkeni eklemeniz gerekiyor

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)

Şimdi sadece değişkeni koşula ekliyorum: ...

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

0

Tüm koşulları bir araya getirme

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

Böyle Bir Şey, İki Koşul İki Sütun

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

Sadece Whentek bir vaka için davrandığı gibi birden fazlasına ihtiyacınız varif.. Elseif else..

   Case when 1=1       //if
   Then
    When 1=1              //else if
     Then.... 
    When .....              //else if
    Then 
    Else                      //else
   ....... 
     End
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.