我在查询一个语句时候,需要根据时间来判断相应的标志来进行查询。
    如select * from tab where sbz in (case when dtnum>'20000101' then '1' when dtnum>'20050101' then '2,3' end);    就是在判断条件的时候,有可能sbz字段需要有两个内容,即sbz in ('2','3').我通过SQL语句case when thenz来实现一个查询。可是通过以上方法,查询出来的数据都是无。     请那位高手告诉我很好的解决办法,只能用一条sql语句。

解决方案 »

  1.   

    dtnum 是“时间”字段,无所谓的,主要是then后面如何填写两个内容
      

  2.   

    select * from tab 
    where (dtnum>'20000101' and sbz = '1') or 
    (dtnum>'20050101'  and sbz in ('2','3')); 
      

  3.   

    如果dtnum是your_tab中的字段,则:select * from your_tab where
           sbz in (select case when dtnum>'20000101' then '1'
                               when dtnum>'20050101' then '2'
                               else '3' end 
                          from your_tab
                  ); 
      

  4.   

    是不是把简单问题搞复杂了?
    select * from tab where dtnum>'20000101' or dtnum>'20050101'就可以实现你描述的需求.
      

  5.   

    WHICH ONE IS CORRECT FOR YOUR BUSINESS ?
    SELECT *
      FROM TAB 
     WHERE SBZ IN ('2','3');
    SELECT *
      FROM TAB
     WHERE DTNUM > TO_NUMBER('20050101');
      

  6.   

    你们都把问题想简单了。
       1. 首先,我这个查询关联到好几个表,sbz字段与dtnum字段并不在一个表内
       2. 查询的时候,需要根据时间的区间来判断相应的sbz
      3. 如果一个区间sbz只有一个值,那查询也很好查,通过case when then 能解决,我也不用写“in”了,直接用“=”好了
      4. 问题是一个区间sbz有两个值,即又要等于2,又要等于3的。
      

  7.   

    楼主,你这个思路建议变更!用动态的SQL来处理!
      

  8.   

    能否把楼主的要求理解为sql in 变量的问题SQL> select * from a;         A B
    ---------- ---
             1 a
             2 b
             3 c
             5 f
             4 eSQL> ed
    已写入文件 afiedt.buf  1  select (case when a > 4 then 'a' when a > '3' then 'a,b,c' end ) "hhh" from a
      2* where a = 4
      3  ;hhh
    -----
    a,b,c
    SQL> select * from a where b in
      2  (select(
      3          case when a > 4 then 'a'
      4               when a > '3' then 'a,b,c'
      5               end) "hhh"
      6         from a where a = 4);未选定行隐身理解:SQL> select * from a where b in
      2  ( select 'a,b,c' from dual);未选定行
    SQL> select *
      2    from a
      3   where b in (select * from table(cast(Hf_StrList('a,b,c') as ht_strlist)));
             A B
    ---------- ---
             1 a
             2 b
             3 c
    不知道我理解的对不对。