举个例子,因为我很难理解我在说什么:
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答案 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'