Các OR
nhà điều hành trong các WHEN
điều khoản của một CASE
tuyên bố không được hỗ trợ. Tôi có thể làm cái này như thế nào?
CASE ebv.db_no
WHEN 22978 OR 23218 OR 23219 THEN 'WECS 9500'
ELSE 'WECS 9520'
END as wecs_system
Các OR
nhà điều hành trong các WHEN
điều khoản của một CASE
tuyên bố không được hỗ trợ. Tôi có thể làm cái này như thế nào?
CASE ebv.db_no
WHEN 22978 OR 23218 OR 23219 THEN 'WECS 9500'
ELSE 'WECS 9520'
END as wecs_system
Câu trả lời:
Đị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
=
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à IN
chỉ cần khớp với một trong các giá trị.
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
IN
từ khóa là cách tốt hơn nhiều
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 đó.
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.
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).
Đã 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:
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 23219
sẽ 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.
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.
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;
ELSE Sales
trườ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.
select id,phno,case gender
when 'G' then 'M'
when 'L' then 'F'
else
'No gender'
end
as gender
from contacts
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
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