在Join上使用case而不返回值

时间:2015-02-13 10:41:49

标签: sql sql-server join left-join case

我需要在SQL Server中执行SQL请求,如下所示:

Select *
From Table_A
LEFT JOIN dbo.Table_2 ON Table_2.Val1 = Table_A.Val1 
                      AND (CASE WHEN Table_A.TADT IS NOT NULL AND Table_A.HSDT IS NOT NULL THEN Table_A.TADT >= Table_A.HSDT END)

它返回错误

  

> =

的语法不正确

如果我删除案例并直接执行:

Select *
From Table_A
LEFT JOIN dbo.Table_2 ON Table_2.Val1 = Table_A.Val1 AND Table_A.TADT >= Table_A.HSDT 

没关系,我只需要在“if”中加入此测试。

如何在SQL中为SQL Server数据库执行此操作?

非常感谢,

致以最诚挚的问候,

2 个答案:

答案 0 :(得分:1)

只需应用布尔逻辑,不需要CASE表达式(根据定义,它总是产生一个值):

Select *
From Table_A
LEFT JOIN dbo.Table_2 ON Table_2.Val1=Table_A.Val1 And
  ( Table_A.TADT IS NULL OR
    Table_A.HSDT IS NULL OR
    Table_A.TADT >= Table_A.HSDT 
  )

答案 1 :(得分:0)

我不建议在比较中使用case,但您可以使用以下结构:

ON Table_2.Val1 = Table_A.Val1 AND
    1 = (CASE WHEN Table_A.TADT IS NOT NULL AND Table_A.HSDT IS NOT NULL AND
                   Table_A.TADT >= Table_A.HSDT
              THEN 1
              WHEN Table_A.TADT IS NOT NULL AND Table_A.HSDT IS NOT NULL
              THEN 0
              ELSE 0
          END)

如果您希望第二次比较为真,当值不为空时,您只需执行以下操作:

ON Table_2.Val1 = Table_A.Val1 AND Table_A.TADT >= Table_A.HSDT

NULL值不会通过此。

如果您希望仅当第二个条件为真或两个值均为NULL时才进行比较,那么这就足够了:

ON (Table_2.Val1 = Table_A.Val1 AND
    Table_A.TADT >= Table_A.HSDT OR
    (Table_A.TADT IS NOT NULL AND Table_A.HSDT IS NOT NULL)
   )

也就是说,将附加支票从then移至when条款。