[英]Case statement syntax MySQL
我有一个运行良好的MySQL存储过程
BEGIN
SELECT ID, SID, SerialNumber, SerialType
FROM orders
WHERE paymentStatus = 'Completed'
AND paymentSuccess = '1'
AND VerificationStatus IS NULL
OR VerificationStatus NOT IN ('Found', 'NotFound', 'NotVerified');
END
但是我需要更改它以根据传递给SerialType的值来不同地返回。 我认为,使用case语句可能是实现此目的的最佳方法,但是努力寻找正确的语法,下面的示例显示了逻辑以及到目前为止我已经尝试过的内容。
BEGIN
SELECT ID, SID, SerialNumber, SerialType
FROM orders
CASE
WHEN SerialType IN ('Var1','Var2') THEN
WHERE paymentStatus = 'Completed' AND paymentSuccess = '1';
WHEN SerialType IN ('Var3','Var4') THEN
WHERE paymentStatus = 'Completed' AND paymentSuccess = '1' AND VerificationStatus IS NULL OR VerificationStatus NOT IN ('Found', 'NotFound', 'NotVerified');
END CASE
END
看来您正在尝试执行以下操作:
SELECT ID, SID, SerialNumber, SerialType
FROM orders
WHERE paymentStatus = 'Completed' AND paymentSuccess = '1' AND
(SerialType IN ('Var1','Var2')
OR
(SerialType IN ('Var3','Var4')
AND VerificationStatus IS NULL
OR VerificationStatus NOT IN ('Found', 'NotFound', 'NotVerified')))
首先,我想知道您的第一个查询是否确实应该是:
SELECT ID, SID, SerialNumber, SerialType
FROM orders
WHERE paymentStatus = 'Completed' AND paymentSuccess = '1' AND
(VerificationStatus IS NULL OR VerificationStatus NOT IN ('Found', 'NotFound', 'NotVerified'));
注意括号。
其次,我怀疑您只想第二次使用更高级的过滤。 看起来像:
SELECT ID, SID, SerialNumber, SerialType
FROM orders
WHERE (SerialType IN ('Var1', 'Var2') AND paymentStatus = 'Completed' AND paymentSuccess = '1') OR
(SerialType IN ('Var3', 'Var4') AND paymentStatus = 'Completed' AND paymentSuccess = '1' AND
VerificationStatus IS NULL OR VerificationStatus NOT IN ('Found', 'NotFound', 'NotVerified')
)
这又可以简化为:
WHERE paymentStatus = 'Completed' AND paymentSuccess = '1' AND
(SerialType IN ('Var1', 'Var2') OR
SerialType IN ('Var3', 'Var4') AND VerificationStatus IS NULL OR VerificationStatus NOT IN ('Found', 'NotFound', 'NotVerified')
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.