我是这样写的,执行不了:
select case
         when q.mode = 0 then
          (select userid from user where organid=q.organid)
         when q.mode = 1 then
          (select userid from qmuser)
         when q.mode = 2 then
          (select userid from tbuser)
       end
  from table1 q where q.id=1因为这种子查询有多个结果 select userid from user where organid=q.organid

解决方案 »

  1.   

    写存储过程吧,非要一个sql实现吗?
      

  2.   

    嗯,要用sql来实现。有没有其他实现方式,不一定非要case when的,我就是根据mode字段的值查询不同的结果
      

  3.   

    我來試一下: Select Decode(q.mode,0,a.userid,1,b.userid,2,c.userid)
    from table1 q ,user a,qmuser b,tbuser c
    where q.id=1 
    and a.organid=q.organid
    and b.organid=q.organid
    and c.organid=q.organid
      

  4.   


    不好意思,理解有誤。。
    錯得好離譜。。抱謙。。
    這樣的語句用一條sql基本很難實現吧。。
      

  5.   

    当然不可以,then 执行的是输出,
    他只能对应着他的then只能是一条记录的一个字段
    select DEPTNO,case 
      when DEPTNO = 10 then (select EMPNO from emp where EMPNO = 7369)
           // 对应着DEPTNO = 10的记录,显示7369,他只能对应着一个具体的输出,而不是一个表,一个记录
      end
     from emp 
    DEPTNO  CASEWHENDEPTNO=10THEN(SELECTEMPNOFROMEMPWHEREEMPNO=7369)END
    20   
    30   
    30   
    20   
    30   
    30   
    10  7369
    20   
    10  7369
    30   
    20   
    30   
    20   
    10  7369 
      

  6.   

    试试,没测
    select (case when A.userid is null then .懒得写了,判断bc的. else a.userid end ) userid
        from
        table1 q ,
        (select 0 mode,userid from user where organid=q.organid) A,
        (select 1 mode,userid from qmuser) B,
        (select 2 mode,userid from tbuser) C
      where q.id=1 
        and q.mode = a.mode(+)
         and q.mode = b.mode(+)
          and q.mode = c.mode(+)
      

  7.   

    a表有个organid的条件,你自己拿到外面吧
      

  8.   

    To Robin_Ares :谢谢,你的方法或许可以实现吧,不过你的写法sql不会短路,性能不好,没法去用的,我们的数据量很大。
      

  9.   

    select (case when A.userid is null then .懒得写了,判断bc的. else a.userid end ) userid 
        from 
        table1 q , 
        (select 0 mode,userid from user where organid=q.organid) A, 
        (select 1 mode,userid from qmuser) B, 
        (select 2 mode,userid from tbuser) C 
      where q.id=1 
        and q.mode = a.mode(+) 
        and q.mode = b.mode(+) 
          and q.mode = c.mode(+)貌似可以,不錯~
      

  10.   

    所以不要一个sql写,因为只需要检索一个表
    即使不写存储过程,在程序里也可以分开写呀
    你先把table1 查出来
    根据结果在决定调用那一个方法
      

  11.   

    select case
             when q.mode = 0 then
              (select userid from user where organid = q.organid and rownum<2)
             when q.mode = 1 then
              (select userid from qmuser and rownum<2)
             when q.mode = 2 then
              (select userid from tbuser and rownum<2)
           end
      from table1 q
     where q.id = 1
      

  12.   

    To oraclelogan:
    我要查询的是多条记录,不是一个记录
      

  13.   


    应该不行吧
    sql的结果是一个笛卡尔积
    你这个查询本身就违背了笛卡尔积的原理呀
      

  14.   

      
      SELECT userid FROM USER U, TABLE1 Q 
      WHERE U.organid = Q.organid AND 
            Q.id = 1  and 
            Q.mode = 0
      UNION
      SELECT SELECT userid FROM qmuser U, TABLE1 Q
      WHERE U.organid = Q.organid AND 
            Q.id = 1  and 
            Q.mode = 1
      UNION
      SELECT SELECT userid FROM tbuser U, TABLE1 Q
      WHERE U.organid = Q.organid AND 
            Q.id = 1  and 
            Q.mode = 2