我有一个完美的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
答案 0 :(得分:1)
您似乎正在尝试做类似的事情:
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')))
答案 1 :(得分:1)
首先,我想知道您的第一个查询是否应该是:
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')
)