【问题标题】:ISNULL - ON clauseISNULL - ON 子句
【发布时间】:2015-12-07 10:09:39
【问题描述】:

我正在尝试在此 ON 子句上使用 ISNULLCOALESCECASE,但它给了我一个错误。

'关键字'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) 

非常感谢。

【问题讨论】:

    标签: sql sql-server-2012 ssms


    【解决方案1】:

    您的语法不正确,因为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
    

    或者使用CASE 功能。

    但出于性能考虑,我建议您事先进行检查,然后针对任何一种情况进行具体查询。

    【讨论】:

      【解决方案2】:

      无法检查,但我想不到,下面的查询可能会有所帮助-

      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
      

      【讨论】:

        猜你喜欢
        • 2019-08-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-28
        • 1970-01-01
        • 2011-11-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多