案例陈述语法MySQL

时间:2014-09-12 11:55:15

标签: mysql sql case

我有一个完美的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

2 个答案:

答案 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')
      )