您不需要 - 而且效率不高 - 进行此转换以应用WHERE
orHAVING
条件。您可以更改条件以处理表列:
WHERE ( eventos.fecha_fin IS NULL
AND DATE_ADD(eventos.fecha_inicio, INTERVAL 45 DAY) >= '2006-01-01'
)
OR ( eventos.fecha_fin IS NOT NULL
AND fecha_fin >= '2006-01-01'
)
可以进一步简化/重写为:
WHERE eventos.fecha_fin IS NULL
AND eventos.fecha_inicio >= DATE_SUB('2006-01-01', INTERVAL 45 DAY)
OR eventos.fecha_fin >= '2006-01-01'
所以,查询可以写成:
SELECT e.id, e.fecha_inicio,
COALESCE( e.fecha_fin, DATE_ADD(e.fecha_inicio, INTERVAL 45 DAY) )
AS fecha_fin_new
FROM eventos AS e
WHERE e.fecha_fin IS NULL
AND e.fecha_inicio >= DATE_SUB('2006-01-01', INTERVAL 45 DAY)
OR e.fecha_fin >= '2006-01-01'
这边走:
- 首先检查
e.fecha_fin IS NULL AND ... OR ...
条件,如果有可用于此条件的索引,则查询将是有效的。所有其他计算都在选定的行上执行。
- 计算的列 - 无论是
CASE
还是IFNULL()
无关紧要CALESCE()
-不是针对表的所有行计算的,仅针对选定的行。
- 该
DATE_FORMAT()
功能不需要应用,而不是一次。