INNER加入IF声明?

时间:2014-11-06 11:55:34

标签: mysql join

在Access中,我有一个使用Inner Join with和IF语句的查询。我是否可以在MySQL中使用它,因为它似乎没有按预期工作,不确定是否缺少某些内容或MySQL是否不允许该方法?

SELECT Matrix.Model, Payment.Cost 
FROM Payment
INNER JOIN Matrix ON if(Left(Matrix.Model,1)='S', Left(Matrix.Model,2), Left(Matrix.Model,1) = Matrix.PreFix)
GROUP BY Matrix.Model

我似乎得到了一些不以S开头的返回,就好像该方法无效但不会导致重大错误。

1 个答案:

答案 0 :(得分:2)

这是您的查询(使用表别名使其更具可读性):

SELECT m.Model, p.Cost 
FROM Payment p INNER JOIN
     Matrix m
     ON if(Left(m.Model,1) = 'S', Left(m.Model, 2), Left(m.Model, 1) = m.PreFix)
GROUP BY m.Model;

请注意,此语句有两种可能的返回值:Left(m.Model, 2)Left(m.Model, 1) = m.PreFix。这是一个数字上下文,因此then子句被解释为数字。以非数字字符开头的字符串(例如S)将转换为0,这是错误的。

我会在没有if()的情况下写这个:

SELECT m.Model, p.Cost 
FROM Payment p INNER JOIN
     Matrix m
     ON (m.model like 'S%' and m.Prefix = Left(m.Model, 2)) or
        (m.model not like 'S%' and m.Prefix = Left(m.Model, 1))
GROUP BY m.Model;

此外,列p.cost将是来自不确定行的值 - 它既不在group by也不在聚合函数中。此构造不适用于任何其他数据库。它使用MySQL的扩展,除非你真正理解你在做什么,否则通常不鼓励使用它。