形如下的SQL: 
select a.aa, a.bb, a.cc 
  from ( select b.aa, b.bb, case b.dd when ... end cc from b) a 
where a.cc = 'someValue' 解释下: 
内层查询中 根据b.dd列的值,经过一系列复杂的判断终于得到cc。 外层查询用这个新列cc来过滤数据。 经测试本人的sql 内层查询( select b.aa, b.bb, case b.dd when ... end cc from b) 的结果毫无问题,新列cc很正常。 
但是外层的 where a.cc = 'someValue' 过滤不起作用, 查询结果是所有数据。 更郁闷的是,程序中还有个地方也都也是形如上面的sql,居然很正常。 哪位大侠给讲讲怎么回事呢,有没有人遇到类似的情况呢?

解决方案 »

  1.   

    不可能的,应当是别的原因产生的,建议楼主把那条SQL的原型发上来。
      

  2.   

    我觉得还是你的语句有逻辑错误,下面是我在store方案中用products表的测试结果,一切正常。
      

  3.   

    应该是忽略了什么地方,我试了,可以正常工作的,下面是语句:
    select a.aa,a.bb,a.cc from
      ( select city aa,city_code bb,case when city_code='2300' then '省会' else '非省会' end cc from tb_jg ) a
      where a.cc='非省会';
    因cc是临时列名,直接放在内循环是不行的,即:
    select city aa,city_code bb,case when city_code='2300' then '省会' else '非省会' end cc from tb_jg  where cc='非省会'是查询不到任何内容,不过不报错,如果用bb还会报错。
      

  4.   

    SELECT CITY AA, CITY_CODE BB
      FROM TB_JG
     WHERE CASE
             WHEN CITY_CODE = '2300' THEN
              '省会'
             ELSE
              '非省会'
           END CC = '非省会'
      

  5.   

    按楼主的写法也可以正常工作:
    select a.aa,a.bb,a.cc from
      (select city aa,city_code bb,case city_code when '2300' then '省会' else '非省会' end cc from tb_jg ) a
     where a.cc='非省会';
      

  6.   


    这语句是不能工作的,我试了,CC = '非省会'条件报错,ORA-00920: invalid relational operator
    也许其他数据库可以,Oracle10不行
      

  7.   

    而且这种写法有别于楼主的初衷了,因为cc不在查询内容里面,这种语句应该不是Oracle的吧
      

  8.   

    为什么不用Decode呢?
    可以这样写select a.aa, a.bb, a.cc  
      from ( select b.aa, b.bb, decode(b.dd,'条件1','Value','条件2','Value','defualt') cc from b) a  
    where a.cc = 'someValue'
      

  9.   


    select b.aa, b.bb, case b.dd when ... end cc 
    from b
    where case b.dd when ... end = 'someValue'
      

  10.   

    with b as
     (select '1' aa, '2' bb, '3' dd
        from dual
      
      union all
      select '1' aa, '2' bb, '4' dd from dual)select a.aa, a.bb, a.cc
      from (select b.aa,
                   b.bb,
                   case
                     when b.dd = '3' then
                      '33'
                     else
                      '44'
                   end cc
              from b) a
     where a.cc = '33'未发现你描述的现象。