我可以在通过IF选择的字段的where子句中应用条件吗?

时间:2012-03-20 13:09:51

标签: mysql

举个例子,因为我很难理解我在说什么:

   SELECT a.f1, 
          b.f1, 
          IF(a.f3 <> '', a.f3, b.f3) as f3 
     FROM a 
LEFT JOIN b 
       ON b.f4 = a.f4 
    WHERE f3 = 'something'

现在,这不起作用,因为我不能将别名作为where子句中的字段,因此如何将条件应用于来自a或b的f3字段。最好不要在where子句

中放入一堆IF

3 个答案:

答案 0 :(得分:3)

哪里不行,但会有。

SELECT
a.f1,
b.f1,
IF(a.f3 <> '', a.f3, b.f3) as fc3
FROM 
a 
LEFT JOIN b on b.f4 = a.f4
HAVING fc3 = 'something'

我重命名计算字段以避免潜在的现有列名冲突

答案 1 :(得分:2)

使用逻辑。

 SELECT a.f1, 
          b.f1, 
          IF(a.f3 <> '', a.f3, b.f3) as f3 
     FROM a 
LEFT JOIN b 
       ON b.f4 = a.f4 
    WHERE a.f3 = 'something' OR (a.f3 == '' AND b.f3 = 'something')

答案 2 :(得分:1)

试试这个:

SELECT * FROM (
    SELECT a.f1, b.f1,
      IF(a.f3 <> '', a.f3, b.f3) as f3
    FROM a 
    LEFT JOIN b on b.f4 = a.f4
) S
WHERE S.f3 = 'something'

这实际上比用公式本身替换值效率低,因为它需要完整扫描。要提高性能(但降低可读性),您可以使用此查询:

SELECT a.f1 aF1, b.f1 bF1,
  IF(a.f3 <> '', a.f3, b.f3) as f3
FROM a 
LEFT JOIN b on b.f4 = a.f4
WHERE IF(a.f3 <> '', a.f3, b.f3) = 'something'