Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 对联接使用大小写,但不返回值_Sql_Sql Server_Join_Left Join_Case - Fatal编程技术网

Sql 对联接使用大小写,但不返回值

Sql 对联接使用大小写,但不返回值,sql,sql-server,join,left-join,case,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) ON Table_2.Val

我需要在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)
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)
它返回一个错误

>=

如果我删除案例并直接执行以下操作:

Select *
From Table_A
LEFT JOIN dbo.Table_2 ON Table_2.Val1 = Table_A.Val1 AND Table_A.TADT >= Table_A.HSDT 
这没关系,不过我需要在连接中做这个测试,只有“如果”

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

非常感谢


请注意,

只需应用布尔逻辑,无需使用
大小写
表达式(根据定义,它总是产生值):


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

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)
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)
如果您希望第二次比较仅在值不为null时为true,则只需执行以下操作:

ON Table_2.Val1 = Table_A.Val1 AND Table_A.TADT >= Table_A.HSDT
NULL
值将不会传递此值

如果仅当第二个条件为true或两个值均为
NULL
时,才希望比较为true,则这就足够了:

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)
   )

也就是说,将附加检查从
然后
移动到
when
子句。

为什么使用“Or”而不是“And”?我只想测试“Table_A.TADT>=Table_A.HSDT”,如果“Table_A.TADT和Table_A.HSDT”不可用null@WalterFabioSimoni-仔细想想。如果
TADT
为空,则不希望执行任何进一步的测试。如果
HSDT
为空,则不希望执行任何进一步的测试。只有当这两个测试都为false时,您才希望实际测试
TADT>HSDT
。所以OR是将这些测试结合在一起的正确方法。(当然,SQL Server可以按任意顺序对测试进行评估,但如果其中一个
为空
结果为真,这意味着我们不关心
比较的结果是什么)它更复杂。在这里,我简化了我的请求,以便解释我想要什么。我只想做:在Table2.aa=Table3.aa上左键连接Table2,如果Table2.bb不为null,Table3.cc不为null,那么Table3.bb>=Current_TimeStamp和Table3.cc@WalterFabioSimoni-仍然,
CASE
将不是该作业的正确工具。您只需要仔细考虑所需的逻辑,并将它们与
s、
s和
而不是
s组合在一起。这种情况的逻辑是什么?如果只有table_A.TADT不为NULL,table_A.HSDT不为NULL,table_A.TADT>=table_A.HSDT,则连接table_2?