在'ON'子句中使用'case function'

问题描述:

我有三张我需要加入的表。在'ON'子句中使用'case function'

表1具有列id,Name,idObject,lineItem。 表2具有列id,City,idLineItem,idOrder,idSupplier,idAdv。 表3的列idAdv,状态。

我的查询是:

select Table1.id, Table1.Name, Table1.idObject, Table2.City, Table3.State 
from Table1 
join Table2 ON case 
       when Table1.Name='abc' then Table1.idObject=Table2.idLineItem 
       when Table1.Name='def' then Table1.idObject=Table2.idOrder 
       else Table1.idObject=Table2.idSupplier 
       end 
join Table3 on Table2.idAdv=Table3.idAdv 
group by Table1.id, Table1.idObject; 
+3

您确实有疑问? – 2013-03-05 00:46:13

+0

即使这可以与'case'语句或其他逻辑一起使用,它也是错误数据库模式设计的查询特征。 – 2013-03-05 01:26:40

case语句只能返回一个值,所以你必须将你相比的情况之外。事情是这样的:

select Table1.id, Table1.Name, Table1.idObject, Table2.City, Table3.State 
from Table1 
join Table2 ON Table1.idObject = case 
       when Table1.Name='abc' then Table2.idLineItem 
       when Table1.Name='def' then Table2.idOrder 
       else Table2.idSupplier 
       end 
join Table3 on Table2.idAdv=Table3.idAdv 
group by Table1.id, Table1.idObject; 
+0

作为比较的结果,OP case语句不会返回适当的布尔类型吗? – 2013-03-05 00:50:32

+0

这些不是布尔比较,它们是连接条件,它们不返回任何内容。 – 2013-03-05 00:53:09

+1

如果他想做布尔比较,他需要做一些事情,比如在Table1.name ='abc'和Table1.idObject = Table2.idLineItem的情况下,连接Table2 on case 1 then .. etc ... else 0结束。 – 2013-03-05 00:54:01

可能..

select Table1.id, Table1.Name, Table1.idObject, Table2.City, Table3.State 
from Table1 
join Table2 ON 
    (Table1.Name='abc' and Table1.idObject=Table2.idLineItem) 
OR (Table1.Name='def' and Table1.idObject=Table2.idOrder) 
OR (Table1.Name <> 'abc' and Table1.Name <> 'def' and Table1.idObject=Table2.idSupplier) 
join Table3 on Table2.idAdv=Table3.idAdv 
group by Table1.id, Table1.idObject; 

更好的检查执行计划,虽然。

我不知道你是否可以在连接子句中使用CASE,但在这种情况下没有理由。只需使用常规逻辑。

select Table1.id, Table1.Name, Table1.idObject, Table2.City, Table3.State 
from Table1 
join Table2 ON 
       (Table1.Name='abc' AND Table1.idObject=Table2.idLineItem) 
       OR (Table1.Name='def' AND Table1.idObject=Table2.idOrder) 
       OR (Table1.Name != 'abc' AND Table1.Name != 'def' AND Table1.idObject=Table2.idSupplier) 
join Table3 on Table2.idAdv=Table3.idAdv 
group by Table1.id, Table1.idObject;