在'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;
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;
作为比较的结果,OP case语句不会返回适当的布尔类型吗? – 2013-03-05 00:50:32
这些不是布尔比较,它们是连接条件,它们不返回任何内容。 – 2013-03-05 00:53:09
如果他想做布尔比较,他需要做一些事情,比如在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;
您确实有疑问? – 2013-03-05 00:46:13
即使这可以与'case'语句或其他逻辑一起使用,它也是错误数据库模式设计的查询特征。 – 2013-03-05 01:26:40