我有一个包含两个时间字段(和其他字段)的表:dateX和dateY。
我希望能够对行进行排序,以便如果dateX不为null,我们使用该行的dateX进行排序,如果dateX为null,我们使用行' dateY进行排序。 / p>
有没有办法优化模式,索引这些列等,以便可以有效地完成此操作,而无需通过添加两个日期组合的列来对行进行反规范化(如果dateX!= null:dateX ?dateY)?
答案 0 :(得分:2)
您可以使用MySQL的IFNULL()
功能:
ORDER BY IFNULL(dateX, dateY)
但请注意,这样的排序操作不会受益于您在表上定义的任何索引 - 因此可能会很慢。
索引可以帮助这种排序的唯一方法是,如您所建议的那样,对表进行非规范化并将此操作的预先计算结果存储在其自己的(索引)列中。如果需要,您可以定义BEFORE INSERT
和BEFORE UPDATE
triggers以确保此类列与基础数据保持一致:
CREATE TRIGGER myTable_bi BEFORE INSERT ON myTable FOR EACH ROW
SET NEW.dateCombined = IFNULL(NEW.dateX, NEW.dateY);
CREATE TRIGGER myTable_bu BEFORE UPDATE ON myTable FOR EACH ROW
SET NEW.dateCombined = IFNULL(NEW.dateX, NEW.dateY);