Sql 对联接使用大小写,但不返回值
我需要在SQL Server中执行如下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
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?