Sql 是否可以在select中设置if/case

Sql 是否可以在select中设置if/case,sql,oracle,Sql,Oracle,是否可以编写基于条件返回一组列的sql查询?以下是一个示例查询: Select id ,name ,col3 From Table A ,left outer join (If (select col6 from table D =='A') { Select col3,col4,col5 as id From Table A ,left join table C ,left join } Else If (se

是否可以编写基于条件返回一组列的sql查询?以下是一个示例查询:

Select 
    id
    ,name
    ,col3

From 
Table A
,left outer join (If (select col6 from table D =='A')
 {
     Select col3,col4,col5 as id
      From Table A
      ,left join table C
      ,left join
  }
 Else If (select col6 from table D =='D')
 {
   Select Col1, Col3 as id
    From Table A
  } ) as temp_tab on temp_tab.id = table A.id

,left outer join Table R on table R.name = table A.name

where id = 129

您可以使用动态SQL或ref游标来实现这一点,这意味着一种过程方法。因此,你需要清楚地知道你想做什么,希望获得什么好处。这尤其会影响代码的调用方式

如果需要纯SQL方法,可以尝试以下方法。内联视图(
temp_tab
)的投影是静态的,但其实际值根据
d.col6
的内容而变化

select 
    x.id
    ,x.name
    ,temp_tab.col3
    ,temp_tab.col4
    ,temp_tab.id
from x
left outer join 
 (
     select case 
                when d.col6 = 'A' then a.col3 
                when d.col6 = 'D' then a.col1
                else null 
            end as col3
            ,case 
                when d.col6 = 'A' then c.col4
                else null
             end as col4
            ,case 
                when d.col6 = 'A' then a.col5 
                when d.col6 = 'D' then a.col3
                else null
             end as id
      from d
           cross join a
           left outer join c on a.whatever = c.whatever
      where (d.col6 = 'D' or c.whatever is not null)      
 ) as temp_tab on temp_tab.id = x.id
where x.id = 129

根据您的具体要求,这可能就足够了,但显然这是一个相当笨拙的解决方案。动态更改FROM子句中的表或WHERE子句中的条件很难做到:如果需要这样做,您将使用动态SQL

您使用的语法/方法是不可能的,但是如果您在问题中添加示例数据,可能会有人为您提供解决方案。谢谢大家!!我只是想检查是否可以用sql编写,所以不想让更多的模式或数据变得复杂。我会先试试,然后再把我得到的详细信息发布出来。这是可能的,但不像你在这里尝试的那样。问题是在您的示例中,您的最终查询仅以
id、name、col3
结束,因此您从另一个子查询中带来
col1、col4、col5
是没有意义的。我们不知道你要的可乐是从哪里来的。如果您包含一些数据和期望的输出,我们可以帮助您构建查询。您可以使用动态SQL或ref游标来实现这一点,这意味着一种过程方法。因此,你需要清楚地知道你想做什么,希望获得什么好处。这尤其会影响代码的调用方式。