首页 > 解决方案 > 如何重写使用join case语句的sql脚本

问题描述

我有以下sql代码:

select t1.*
from t1
join t3 on t3.id = t1.id
join t2 on case when t1.date is null then t2.date = t3.date else t1.date = t2.date

但是在连接中使用 case 语句并不是最佳选择有没有办法重写这个,我什么都没有想到

标签: sqlpostgresql

解决方案


让我们先交换t2.date,以便它总是发生在比较操作的左侧:

case when t1.date is null then t2.date = t3.date else t1.date = t2.date

变成:

case when t1.date is null then t2.date = t3.date else t2.date = t1.date 

然后我们观察到t2.date在case语句的两种情况下总是比较,即它是非空的。我们可以在下面的 coalesce 语句中表达 case 语句:

t2.date = coalesce(t1.date, t3date)

这看起来更干净,但在功能上仍然与 case 语句相同。

请注意,如果您没有从t2and投射任何值t3,那么执行 a 会更快where date in (select date from t2) or date in (select date from t3)


推荐阅读