如何在mysql的where子句中使用if条件

时间:2015-04-14 07:28:47

标签: mysql

我有一个查询从两个表中获取记录。我想在where子句中使用和运算符。

这是我的代码:

SELECT sfo.customer_id, sfo.increment_id FROM sales_flat_order sfo 
INNER JOIN  marketplace_partnertype mptype ON sfo.customer_id = mptype.partner_id 
WHERE (mptype.type = 'free' AND sfo.status='complete') AND IF @mptype.type=='free' THEN ((DATE( updated_at ) = DATE_SUB( CURDATE( ) , INTERVAL 5 DAY ))ELSE (DATE( updated_at ) = DATE_SUB( CURDATE( ) , INTERVAL 3 DAY );

它显示IF @mptype.type=='free'附近的语法错误。

如果有人帮助解决这个问题,那应该是值得注意的。

3 个答案:

答案 0 :(得分:2)

If条件的语法是:

IF(<cond-expr>, <then-expr>, <else-expr>)

如果我们改变条件,它将是: -

AND IF (@mptype.type=='free', (DATE( updated_at ) = DATE_SUB( CURDATE( ) , INTERVAL 5 DAY )) ,(DATE( updated_at ) = DATE_SUB( CURDATE( ) , INTERVAL 3 DAY ))

查询将如下所示:

SELECT sfo.customer_id, sfo.increment_id FROM sales_flat_order sfo 
INNER JOIN  marketplace_partnertype mptype ON sfo.customer_id = mptype.partner_id 
WHERE (mptype.type = 'free' AND sfo.status='complete')AND IF (@mptype.type=='free', (DATE( updated_at ) = DATE_SUB( CURDATE( ) , INTERVAL 5 DAY )) ,(DATE( updated_at ) = DATE_SUB( CURDATE( ) , INTERVAL 3 DAY )))

答案 1 :(得分:1)

语法不正确,您可以在where条件中使用case-when条件

SELECT sfo.customer_id, sfo.increment_id FROM sales_flat_order sfo 
INNER JOIN  marketplace_partnertype mptype ON sfo.customer_id = mptype.partner_id 
WHERE (mptype.type = 'free' AND sfo.status='complete')
and 
case 
 when @mptype.type = 'free' then  DATE( updated_at ) = DATE_SUB( CURDATE( ) , INTERVAL 5 DAY )
 else DATE( updated_at ) = DATE_SUB( CURDATE( ) , INTERVAL 3 DAY ) 
end 

答案 2 :(得分:1)

没有必要使用IF或CASE WHEN:

SELECT
  sfo.customer_id,
  sfo.increment_id
FROM
  sales_flat_order sfo INNER JOIN  marketplace_partnertype mptype
  ON sfo.customer_id = mptype.partner_id 
WHERE
  (mptype.type = 'free' AND DATE(updated_at) = DATE_SUB(CURDATE(), INTERVAL 5 DAY)
  OR (mptype.type = 'complete' AND DATE(updated_at) = DATE_SUB(CURDATE(), INTERVAL 3 DAY);

但如果您想以这种方式使用案例:

WHERE
  mptype.type IN ('free', 'complete')
  AND DATE(updated_at) = DATE_SUB(CURDATE(), INTERVAL CASE WHEN mptype.type='free' THEN 3 ELSE 5 END DAY)