Sql ISNULL-ON子句

Sql ISNULL-ON子句,sql,sql-server-2012,ssms,Sql,Sql Server 2012,Ssms,我试图在这个on子句上使用ISNULL、COALESCE或CASE,但它给了我一个错误 '关键字'between'附近的语法不正确' 我需要在另一个表的两个日期之间检查一个表中的一个日期,但是如果第二个表中不存在该日期,则使用前一个日期 talbe1 t1 JOIN table2 t2 ON t1.code = t2.code AND ISNULL(cast(dateadd(d,-1,t1.UtcFinishTime) as date) BETWEEN t2.TransactionFirstD

我试图在这个
on
子句上使用
ISNULL
COALESCE
CASE
,但它给了我一个错误

'关键字'between'附近的语法不正确'

我需要在另一个表的两个日期之间检查一个表中的一个日期,但是如果第二个表中不存在该日期,则使用前一个日期

talbe1 t1 JOIN table2 t2
ON t1.code = t2.code 
AND ISNULL(cast(dateadd(d,-1,t1.UtcFinishTime) as date) BETWEEN t2.TransactionFirstDate and t2.TransactionLastDate,cast(dateadd(d,-2,t1.UtcFinishTime) as date) BETWEEN t2.TransactionFirstDate and t2.TransactionLastDate) 

非常感谢。

无法检查它,但在我的脑海中,下面的查询可能会有所帮助-

SELECT * 
from table1 t1 JOIN table2 t2
     ON t1.code = t2.code AND 
     CASE 
       WHEN dateadd(day,-1,t1.UtcFinishTime) is null 
       THEN cast(dateadd(day,-2,t1.UtcFinishTime) as date) 
       END 
     BETWEEN t2.TransactionFirstDate and t2.TransactionLastDate

您的语法不正确,因为
ISNULL
在返回值时需要成为语句的一部分;而不是整个陈述,所以你可能想要:

AND ISNULL(
           cast(dateadd(d,-1,t1.UtcFinishTime) as date), 
           cast(dateadd(d,-2,t1.UtcFinishTime) as date)
          ) 
     BETWEEN t2.TransactionFirstDate and t2.TransactionLastDate
或者使用
案例
功能

但出于性能考虑,我建议您先进行检查,然后针对这两种情况进行具体查询