---表T,有字段A\B\C\D\E\F.....等,均为int类型,每记录这几列值都可以=1或0(或其他值)
 --'执行A子查询','执行B子查询',实际为子查询对应不同表字段,不是固定
 SELECT CASE WHEN A=1 THEN '执行A子查询' ELSE (CASE WHEN B=1 THEN '执行B子查询' ELSE (CASE WHEN C=1 THEN '执行C子查询' ELSE ('此处应为继续判断D=1...等,略')
 END)
 END)
 END AS c 
 from t 
 --请问是否可以简化查询为以下语句,是否有漏洞,当A=1时只要A了查询的结果,即使同记录的B=1也不执行B子查询。。
 --这样少了很多嵌套,比较简练
 SELECT CASE WHEN A=1 THEN '执行A子查询' WHEN  B=1 THEN '执行B子查询'when C=1 THEN '执行C子查询' ELSE ('此处应为继续判断D=1...等,略')
  
 END AS c 
 from t 

解决方案 »

  1.   

    当第一个case 满足条件时就不会执行下面那些,你这样判断组合很多啊,比如B的时候要加上A<>1 AND B=1,这样才执行B,c的话就更多了
      

  2.   

    我认为你的简化语句是对的!
    当满足A=1时,执行A子查询,不会再管B、C…是否为1
    当不满足A=1而满足B=1时,执行B子查询,不会再管C、D…是否为1
    ......
      

  3.   

    确定当第一个case 满足条件时就不会执行下面吗?这样的话就不用加 比如B的时候要加上A<>1 AND B=1了吧?
      

  4.   

    你这种需求不可用case语句,因为case和if else语句一样,只要条件满足一次,else后面不会 再执行应该这样类似的语句
    select a.* ,a.name ,b.name ,b.name
    from Temp t
    left join ta a on t.A=1 and t.typeID=a.ID
    left join tb b on t.B=1 and t.typeID=b.ID
    left join tc c on t.C=1 and t.typeID=c.ID
      

  5.   

    确定当第一个case 满足条件时就不会执行下面吗?这样的话就不用加 比如B的时候要加上A<>1 AND B=1了吧?既然你要执行B,那么按照你的写法,应该A不能满足,所以要写上使A不满足的情况,就是A<>1,而C的话,就要写上A<>1 AND B<>1 AND C=1,如此类推,后面会越来越长。
      

  6.   

    DBA_Huangzj 版,2#对吗?如果正确,这样写就简单多了
      

  7.   

    简化有问题。
    多个when是并列的。 判断完一个when后,会继续判断另一个when
    个人看法:
    flag=rtrim(ltrim(STR(A)))+rtrim(ltrim(STR(B)))......charindex('1',flag)可以得到flag第几位为1,即需要执行第几个子查询判断比较少
      

  8.   

    补充一下,我写在前面列case是有优先级的, 可以忽略后面的值是否为1,只要排在前面的列为1就想取前面的子查询,不管后面的列的值是否也=1.
      

  9.   

    select '执行'+char(65+CHARINDEX('1',rtrim(ltrim(STR(A)))+rtrim(ltrim(STR(B))))+....  )+'子查询'
      

  10.   

    是的,只要确定”当第一个case 满足条件时就不会执行下面那些case“,就满足我的要求了,那么简写也是对的了。
    to shaniu19:您的方法不对啊
      

  11.   

    是的,只要确定”当第一个case 满足条件时就不会执行下面那些case“,就满足我的要求了,那么简写也是对的了。
    to shaniu19:您的方法不对啊那可以用你的简化