SQLite中能否在SELECT语句中使用变量简化重复计算?
简化重复计算日期差值的SQL语句
你的SQL语句确实存在重复计算JULIANDAY('now') - JULIANDAY(ReadingDay)的问题,以下几种方案可以帮你简化代码,避免重复计算:
方案1:使用CTE(公共表表达式)
先通过CTE一次性计算出所有记录的日期差值,再基于这个临时结果集进行筛选:
WITH DateDiffCTE AS ( SELECT CAST((JULIANDAY('now') - JULIANDAY(ReadingDay)) AS INTEGER) AS DaysSinceReading FROM Readings ) SELECT DaysSinceReading FROM DateDiffCTE WHERE DaysSinceReading > 90;
方案2:使用HAVING子句
SQLite允许在未使用GROUP BY的场景下,用HAVING引用SELECT子句中定义的别名,这样可以直接复用计算结果:
SELECT CAST((JULIANDAY('now') - JULIANDAY(ReadingDay)) AS INTEGER) AS DaysSinceReading FROM Readings HAVING DaysSinceReading > 90;
方案3:使用子查询
如果你的SQL环境对CTE支持有限,也可以用子查询实现类似效果:
SELECT DaysSinceReading FROM ( SELECT CAST((JULIANDAY('now') - JULIANDAY(ReadingDay)) AS INTEGER) AS DaysSinceReading FROM Readings ) AS SubQuery WHERE DaysSinceReading > 90;
以上三种方案都只计算一次日期差值,代码更简洁易读,同时逻辑和原语句完全一致。
内容的提问来源于stack exchange,提问作者James Martin
相关产品推荐
相关产品推荐

