Bagaimana saya melakukan beberapa KASUS KETIKA kondisi menggunakan SQL Server 2008?


173

Apa yang saya coba lakukan adalah menggunakan lebih dari satu KASUS KETIKA kondisi untuk kolom yang sama.

Ini kode saya untuk kueri:

   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)

Namun, yang ingin saya lakukan adalah menggunakan lebih dari satu KAPAN untuk kolom yang sama "qty".

Seperti dalam kode berikut:

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

8
Apakah ada sesuatu case when <condition> then <vaue> when <condition> then <value> . . . endyang tidak berfungsi?
Gordon Linoff

1
Seperti yang dikatakan @GordonLinoff, Anda dapat memiliki lebih dari satu WHEN.
Kermit

Persis seperti yang Anda katakan. Saya telah menempatkan tanda kurung di tempat yang salah. Maaf kawan!
Nils Anders

Jawaban:


390

Ada dua format ekspresi kasus . Anda dapat melakukannya CASEdengan banyak orang WHEN;

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

AtauCASE ungkapan sederhana

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

Atau di CASE dalam CASE sebagai;

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
ADA DUA. Daftar tiga : D
d8aninja

Apakah kasus dalam divalidasi jika kasus outter tidak kembali benar?
ggderas

3
@ d8aninja Mereka hanya mencantumkan 2. Yang ketiga adalah kombinasi dari dua yang pertama, dengan kasing luar menjadi yang pertama dan kasing dalam adalah yang kedua.
Terbang

12

Cukup gunakan ini, Anda harus menggunakan lebih banyak ketika mereka kelas.

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

Anda dapat menggunakan contoh case di bawah ini dengan beberapa kondisi.

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

Ini bisa menjadi cara yang efisien untuk melakukan tes yang berbeda pada satu pernyataan

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

ini hanya berfungsi pada perbandingan kesetaraan!


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
Tidak perlu untuk menumpuk ekspresi CASES seperti ini, Anda dapat memiliki beberapa klausa KAPAN dalam satu KASUS.
Barmar

2
Ketika kondisi pertama terpenuhi, sisa kondisi diabaikan?
Minggu

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
Tolong, format jawaban Anda dan mungkin tambahkan beberapa penjelasan.
tmt

0

Saya memiliki yang serupa tetapi berurusan dengan tanggal. Permintaan untuk menampilkan semua item untuk bulan lalu, berfungsi dengan baik tanpa syarat hingga Jan. Agar berfungsi dengan benar, perlu menambahkan variabel tahun dan bulan

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)

Sekarang saya hanya menambahkan variabel ke dalam kondisi: ...

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

0

Menggabungkan semua kondisi

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

Sesuatu Seperti ini, Dua Kondisi Dua Kolom

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

Hanya saja Anda perlu beberapa Whenuntuk satu kasus untuk berperilaku seperti ituif.. Elseif else..

   Case when 1=1       //if
   Then
    When 1=1              //else if
     Then.... 
    When .....              //else if
    Then 
    Else                      //else
   ....... 
     End
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.