HOẶC không được hỗ trợ với Tuyên bố CASE trong SQL Server


Câu trả lời:


1079

Định dạng đó yêu cầu bạn sử dụng một trong hai:

CASE ebv.db_no 
  WHEN 22978 THEN 'WECS 9500' 
  WHEN 23218 THEN 'WECS 9500'  
  WHEN 23219 THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 

Nếu không, sử dụng:

CASE  
  WHEN ebv.db_no IN (22978, 23218, 23219) THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 

9
Đối với trường hợp thứ hai, tại sao chỉ 'IN' hoạt động mà không '='?
Han

25
=sẽ hoạt động nếu bạn đang so sánh với một giá trị duy nhất. Tuy nhiên, (22978, 23218, 23219)là một mảng và INchỉ cần khớp với một trong các giá trị.
LdTrigger

2
Điều này thực sự hôi thối không thể xử lý "hoặc" trong một tuyên bố trường hợp. Hãy đến với Microsoft thời gian để trưởng thành từ trạng thái cơ sở dữ liệu đồ chơi.
Rich Bianco

1
"không thể xử lý" hoặc "trong một tuyên bố trường hợp" .. hmmm .... tôi không nghĩ rằng tôi đã từng thấy một công tắc chấp nhận "hoặc" trong bất kỳ ngôn ngữ nào. dường như đánh bại mục đích của một chuyển đổi. ngôn ngữ nào chấp nhận "hoặc" trong một trường hợp?
Heriberto Lugo

2
@Heriberto Lugo Tôi không biết bạn biết bao nhiêu ngôn ngữ nhưng có ít nhất một vài ngôn ngữ. VB.NET và C # có thể sử dụng chúng với phân tách dấu phẩy đơn giản. Nó không đánh bại bất cứ điều gì vì nó sẽ giúp bạn không lặp lại cùng một mã trong nhiều trường hợp.
Johnny Prescott

249
CASE
  WHEN ebv.db_no = 22978 OR 
       ebv.db_no = 23218 OR
       ebv.db_no = 23219
  THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 

38
upvote - phản ứng này không thêm giá trị. Nó phù hợp hơn với câu hỏi của OP và nếu bạn muốn lồng một số CASE-WHENS cú pháp này làm giảm đáng kể mã cần thiết.
Matt Kemp

1
@Leigh Tôi đánh giá cao câu trả lời này. Thật tuyệt khi có tất cả các định dạng khác nhau trong một luồng và làm cho nó có thể sử dụng nhiều hơn như một tài liệu tham khảo.
Jason Wheeler

3
@Bigwheels - Wow .. đây là một thời gian trước đây. Tôi có thể không đồng ý bởi vì, về mặt logic, nó hoàn toàn giống với các phản hồi khác . Điều đó nói rằng, bạn và Matt làm cho điểm hợp lệ. Nếu câu hỏi là "cú pháp đúng chỉ sử dụng OR " là gì, thì câu hỏi này cung cấp câu trả lời. Tuy nhiên, nếu "giảm cú pháp cần thiết" là mục tiêu, thì phản hồi được chấp nhận sẽ gọn hơn. BTW, đó không phải là một câu trả lời cho câu trả lời của Darren, điều này hoàn toàn hợp lệ. Chỉ cần 0,02 đô la của tôi :)
Leigh

2
sử dụng INtừ khóa là cách tốt hơn nhiều
Sagar Naliyapara

57
CASE WHEN ebv.db_no  IN (22978, 23218, 23219) THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 

53

Bạn có thể sử dụng một trong các biểu thức mà KHI có, nhưng bạn không thể trộn cả hai biểu thức đó.

  1. KHI khi nào_expression

    Là một biểu thức đơn giản mà input_expression được so sánh khi định dạng CASE đơn giản được sử dụng. khi_expression là bất kỳ biểu thức hợp lệ. Các kiểu dữ liệu của input_expression và mỗi khi_expression phải giống nhau hoặc phải là một chuyển đổi ngầm định.

  2. KHI Boolean_expression

    Là biểu thức Boolean được đánh giá khi sử dụng định dạng CASE được tìm kiếm. Boolean_expression là bất kỳ biểu thức Boolean hợp lệ nào.

Bạn có thể lập trình:

1.

    CASE ProductLine
            WHEN 'R' THEN 'Road'
            WHEN 'M' THEN 'Mountain'
            WHEN 'T' THEN 'Touring'
            WHEN 'S' THEN 'Other sale items'
            ELSE 'Not for sale'

2.

    CASE
            WHEN ListPrice =  0 THEN 'Mfg item - not for resale'
            WHEN ListPrice < 50 THEN 'Under $50'
            WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250'
            WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000'
            ELSE 'Over $1000'
          END

Nhưng trong mọi trường hợp, bạn có thể mong đợi rằng xếp hạng biến sẽ được so sánh trong biểu thức boolean.

Xem CASE (Transact-SQL) (MSDN).


37

Đã có rất nhiều câu trả lời liên quan đến CASE. Tôi sẽ giải thích khi nào và làm thế nào để sử dụng CASE.

Bạn có thể sử dụng các biểu thức CASE ở bất cứ đâu trong các truy vấn SQL. Các biểu thức CASE có thể được sử dụng trong câu lệnh SELECT, mệnh đề WHERE, mệnh đề theo mệnh đề, mệnh đề HAVING, câu lệnh Chèn, CẬP NHẬT và XÓA.

Biểu thức CASE có hai định dạng sau:

  1. Biểu thức CASE đơn giản

    CASE expression
    WHEN expression1 THEN Result1
    WHEN expression2 THEN Result2
    ELSE ResultN
    END

    Điều này so sánh một biểu thức với một tập hợp các biểu thức đơn giản để tìm kết quả. Biểu thức này so sánh một biểu thức với biểu thức trong mỗi mệnh đề WHEN cho tương đương. Nếu biểu thức trong mệnh đề WHEN được khớp, biểu thức trong mệnh đề THEN sẽ được trả về.

    Đây là nơi câu hỏi của OP đang giảm. 22978 OR 23218 OR 23219sẽ không nhận được giá trị bằng biểu thức tức là ebv.db_no. Đó là lý do tại sao nó đưa ra một lỗi. Các kiểu dữ liệu của input_expression và mỗi khi_expression phải giống nhau hoặc phải là một chuyển đổi ngầm định.

  2. Tìm kiếm biểu thức CASE

    CASE
    WHEN Boolean_expression1 THEN Result1
    WHEN Boolean_expression2 THEN Result2
    ELSE ResultN
    END

    Biểu thức này đánh giá một tập hợp các biểu thức boolean để tìm kết quả. Biểu thức này cho phép các toán tử so sánh và các toán tử logic AND / OR với trong mỗi biểu thức Boolean.

Câu lệnh 1.SELECT với các biểu thức CASE

--Simple CASE expression: 
SELECT FirstName, State=(CASE StateCode
 WHEN 'MP' THEN 'Madhya Pradesh' 
 WHEN 'UP' THEN 'Uttar Pradesh' 
 WHEN 'DL' THEN 'Delhi' 
 ELSE NULL 
 END), PayRate
FROM dbo.Customer

-- Searched CASE expression:
SELECT FirstName,State=(CASE 
 WHEN StateCode = 'MP' THEN 'Madhya Pradesh' 
 WHEN StateCode = 'UP' THEN 'Uttar Pradesh' 
 WHEN StateCode = 'DL' THEN 'Delhi' 
 ELSE NULL 
 END), PayRate
FROM dbo.Customer

Câu lệnh 2.Update với biểu thức CASE

-- Simple CASE expression: 
UPDATE Customer 
SET StateCode = CASE StateCode
 WHEN 'MP' THEN 'Madhya Pradesh' 
 WHEN 'UP' THEN 'Uttar Pradesh' 
 WHEN 'DL' THEN 'Delhi' 
 ELSE NULL 
 END 

-- Simple CASE expression: 
UPDATE Customer 
SET StateCode = CASE 
 WHEN StateCode = 'MP' THEN 'Madhya Pradesh' 
 WHEN StateCode = 'UP' THEN 'Uttar Pradesh' 
 WHEN StateCode = 'DL' THEN 'Delhi' 
 ELSE NULL 
 END 

Mệnh đề 3.ORDER BY với các biểu thức CASE

-- Simple CASE expression: 
SELECT * FROM dbo.Customer
ORDER BY 
 CASE Gender WHEN 'M' THEN FirstName END Desc,
 CASE Gender WHEN 'F' THEN LastName END ASC

-- Searched CASE expression: 
SELECT * FROM dbo.Customer
ORDER BY 
 CASE WHEN Gender='M' THEN FirstName END Desc,
 CASE WHEN Gender='F' THEN LastName END ASC

4. Điều khoản có biểu thức CASE

-- Simple CASE expression: 
SELECT FirstName ,StateCode,Gender, Total=MAX(PayRate)
FROM dbo.Customer
GROUP BY StateCode,Gender,FirstName
HAVING (MAX(CASE Gender WHEN 'M' 
 THEN PayRate 
 ELSE NULL END) > 180.00
 OR MAX(CASE Gender WHEN 'F' 
 THEN PayRate 
 ELSE NULL END) > 170.00)

-- Searched CASE expression: 
SELECT FirstName ,StateCode,Gender, Total=MAX(PayRate)
FROM dbo.Customer
GROUP BY StateCode,Gender,FirstName
HAVING (MAX(CASE WHEN Gender = 'M' 
 THEN PayRate 
 ELSE NULL END) > 180.00
 OR MAX(CASE WHEN Gender = 'F' 
 THEN PayRate 
 ELSE NULL END) > 170.00)

Hy vọng trường hợp sử dụng này sẽ giúp ai đó trong tương lai.

Nguồn


34

Thử

CASE WHEN ebv.db_no IN (22978,23218,23219) THEN 'WECS 9500' ELSE 'WECS 9520' END

28
SELECT
  Store_Name,
  CASE Store_Name
    WHEN 'Los Angeles' THEN Sales * 2
    WHEN 'San Diego' THEN Sales * 1.5
    ELSE Sales
    END AS "New Sales",
  Txn_Date
FROM Store_Information;

1
Nâng cấp vì bao gồm một ELSE Salestrường, trả về giá trị mặc định nếu không có trong trường hợp khác, phù hợp với các truy vấn kinh doanh.
FoxDeploy

3
select id,phno,case gender
when 'G' then 'M'
when 'L' then 'F'
else
'No gender'
end
as gender 
from contacts

1
Tại sao bạn không giải thích những gì đang được thực hiện ở đây? Điều quan trọng là đưa ra câu trả lời đầy đủ với Giải thích vì một số người mới có thể cần điều đó để hiểu cách giải quyết vấn đề này
Gerhard Barnard

3
UPDATE table_name 
  SET column_name=CASE 
WHEN column_name in ('value1', 'value2',.....) 
  THEN 'update_value' 
WHEN column_name in ('value1', 'value2',.....) 
  THEN 'update_value' 
END

table_name = Tên của bảng mà bạn muốn thực hiện thao tác.

column_name = Tên của Cột / Trường mà giá trị bạn muốn đặt.

update_value = Giá trị bạn muốn đặt column_name


11
Mặc dù mã này có thể giải quyết vấn đề của OP, một vài lời giải thích thậm chí sẽ hữu ích hơn cho các độc giả tương lai.
Thơm

-5
Select s.stock_code,s.stock_desc,s.stock_desc_ar,
mc.category_name,s.sel_price,
case when s.allow_discount=0 then 'Non Promotional Item' else 'Prmotional 
item' end 'Promotion'
From tbl_stock s inner join tbl_stock_category c on s.stock_id=c.stock_id
inner join tbl_category mc on c.category_id=mc.category_id
where mc.category_id=2 and s.isSerialBased=0 

1
Câu trả lời này có vẻ như không liên quan gì đến câu hỏi.
LarsTech

4
Xin vui lòng không đăng mã trần, cũng cung cấp một lời giải thích về những gì mã của bạn đang làm.
Jonathan Mee
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.