如何基于字段值在SQL的WHERE子句中动态选择时间条件列?
需求可行性及实现方案
这个需求完全可行,不需要重写整个产品,只需要修改原SQL的WHERE子句中的时间判断逻辑即可,利用SQL的条件分支函数就能实现动态选择时间范围的判断。
具体实现方式
你可以通过IF函数或者CASE WHEN语法,根据klassrumsstat_tb.av_tid的值动态选择要对比的起止时间字段,以下是修改后的完整SQL:
方式一:使用IF函数(MySQL友好写法)
select klassrumsstat_tb.*, pass_tb.pass_namn, pass_tb.pass_start, pass_tb.pass_stop, klasser_tb.klassnamn, personer_tb.förnamn, personer_tb.efternamn, klassrum_tb.rumsnamn, ämnen_tb.ämne from klassrumsstat_tb inner join pass_tb on pass_tb.pasid = klassrumsstat_tb.pasid inner join klasser_tb on klasser_tb.klassid = klassrumsstat_tb.klass inner join personer_tb on personer_tb.uid = klassrumsstat_tb.uid inner join klassrum_tb on klassrum_tb.klaid = klassrumsstat_tb.klaid inner join ämnen_tb on ämnen_tb.aid = klassrumsstat_tb.aid where klassrumsstat_tb.klaid = 1 and dag = 'Mon' -- 动态匹配起始时间 and curtime() > IF(klassrumsstat_tb.av_tid = 1, klassrumsstat_tb.av_tid_start, pass_tb.pass_start) -- 动态匹配结束时间 and curtime() < IF(klassrumsstat_tb.av_tid = 1, klassrumsstat_tb.av_tid_stop, pass_tb.pass_stop);
方式二:使用CASE WHEN语法(通用数据库写法)
如果你的数据库是PostgreSQL、SQL Server等,用CASE WHEN可读性更强,兼容性也更好:
select klassrumsstat_tb.*, pass_tb.pass_namn, pass_tb.pass_start, pass_tb.pass_stop, klasser_tb.klassnamn, personer_tb.förnamn, personer_tb.efternamn, klassrum_tb.rumsnamn, ämnen_tb.ämne from klassrumsstat_tb inner join pass_tb on pass_tb.pasid = klassrumsstat_tb.pasid inner join klasser_tb on klasser_tb.klassid = klassrumsstat_tb.klass inner join personer_tb on personer_tb.uid = klassrumsstat_tb.uid inner join klassrum_tb on klassrum_tb.klaid = klassrumsstat_tb.klaid inner join ämnen_tb on ämnen_tb.aid = klassrumsstat_tb.aid where klassrumsstat_tb.klaid = 1 and dag = 'Mon' and curtime() > CASE WHEN klassrumsstat_tb.av_tid = 1 THEN klassrumsstat_tb.av_tid_start ELSE pass_tb.pass_start END and curtime() < CASE WHEN klassrumsstat_tb.av_tid = 1 THEN klassrumsstat_tb.av_tid_stop ELSE pass_tb.pass_stop END;
逻辑说明
- 当
av_tid等于1时,使用klassrumsstat_tb表中的自定义时间av_tid_start、av_tid_stop与当前时间curtime()对比 - 当
av_tid等于0时,沿用原有逻辑,使用pass_tb表的pass_start、pass_stop进行判断
这两种写法都只需要替换原SQL的WHERE子句时间判断部分,无需改动产品其他模块即可完成需求。
内容的提问来源于stack exchange,提问作者Tobias Bäckström
相关产品推荐
相关产品推荐

