Làm cách nào để thực hiện nhiều điều kiện CASE KHI sử dụng SQL Server 2008?


173

Những gì tôi đang cố gắng làm là sử dụng nhiều hơn một điều kiện CASE KHI cho cùng một cột.

Đây là mã của tôi cho truy vấn:

   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)

Tuy nhiên, những gì tôi muốn làm là sử dụng nhiều hơn một KHI cho cùng một cột "qty".

Như trong đoạn mã sau:

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

8
Có điều gì case when <condition> then <vaue> when <condition> then <value> . . . endđó không hoạt động?
Gordon Linoff

1
Như @GordonLinoff đã nói, bạn có thể có nhiều hơn một WHEN.
Kermit

Chính xác như bạn nói. Tôi đã đặt dấu ngoặc đơn ở sai vị trí. Xin lỗi các bạn!
Nils Anders

Câu trả lời:


389

hai định dạng biểu hiện trường hợp . Bạn có thể làm CASEvới nhiều WHENnhư;

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

Hoặc một CASEbiểu thức đơn giản

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

Hoặc CASE trong CASE như;

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
CÓ HAI. Liệt kê ba : D
d8aninja

Là trường hợp bên trong được xác nhận nếu trường hợp bên ngoài không trở lại đúng?
ggderas

3
@ d8aninja Họ chỉ liệt kê 2. Thứ ba là sự kết hợp của hai cái đầu tiên, với vỏ ngoài là loại thứ nhất và vỏ bên trong là loại thứ hai.
bay

12

Chỉ cần sử dụng cái này, Bạn phải sử dụng nhiều hơn khi chúng là các lớp.

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

Bạn có thể sử dụng ví dụ dưới đây của trường hợp khi có nhiều điều kiện.

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

Đây có thể là một cách hiệu quả để thực hiện các thử nghiệm khác nhau trên một tuyên bố

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

Điều này chỉ hoạt động trên so sánh bình đẳng!


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
Không cần lồng các biểu thức CASES như thế này, bạn có thể có nhiều mệnh đề KHI trong một CASE duy nhất.
Barmar

2
Khi điều kiện đầu tiên được đáp ứng, các điều kiện còn lại bị bỏ qua?
CN

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
Xin vui lòng, định dạng câu trả lời của bạn và có thể thêm một số lời giải thích.
tmt

0

Tôi đã có một tương tự nhưng nó đã được xử lý với ngày. Truy vấn để hiển thị tất cả các mục cho tháng trước, hoạt động tuyệt vời mà không cần điều kiện cho đến tháng Một. Để nó hoạt động chính xác, cần thêm một biến số năm và tháng

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)

Bây giờ tôi chỉ cần thêm biến vào điều kiện: ...

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

0

Kết hợp mọi điều kiện

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

Một cái gì đó như thế này, Hai điều kiện Hai cột

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

Chỉ là bạn cần nhiều Whencho một trường hợp duy nhất để hành xử như thếif.. Elseif else..

   Case when 1=1       //if
   Then
    When 1=1              //else if
     Then.... 
    When .....              //else if
    Then 
    Else                      //else
   ....... 
     End
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.