有两张表:Z_WZSJ(nwzsj_sn,dwzsj,swzxw)   --ID,违法时间,违法行为
         c_wzxw(swzxw,sxwmc,sbb)        --违法行为代码,违法行为名称,版本(有1,2,3,9)1. 查询z_wzsj信息,必须根据违法时间来取出相应的违法行为名称
2. 比如dwzsj在2000-1-1到2005-1-1内,相应的违法行为的版本为1,2
      dwzsj在2005-1-2到2008-1-1内,相应的违法行为的版本为3,9
3. 具体的查询要求为如下
   select nwzsj_sn,dwzsj,a.swzxw,b.sxwmc from z_wzsj a,c_wzxw b where a.swzxw=b.swzxw and sbb in (case when dwzsj>='20000101' and 
          dwzsj<='20050101' then '(1,2)' when dwzsj>='20050102' and dwzsj<='20080101' then '(3,9)' end);4. 我需要实现以上功能,但问题是以上SQL语句执行记录总是为空,希望高手帮我解决 

解决方案 »

  1.   


    select nwzsj_sn, dwzsj, a.swzxw, b.sxwmc
      from z_wzsj a, c_wzxw b
     where a.swzxw = b.swzxw
       and dwzsj >= '20000101'
       and dwzsj <= '20050101'
       and sbb in (1, 2)
    union all
    select nwzsj_sn, dwzsj, a.swzxw, b.sxwmc
      from z_wzsj a, c_wzxw b
     where a.swzxw = b.swzxw
       and dwzsj >= '20050102'
       and dwzsj <= '20080101'
       and sbb in (3, 9);
      

  2.   

    zmgowin :
       现在我是先写两种情况,如果是多种情况,涉及到5种情况呢?如果我查询再涉及到很多个表呢,也用你这种方式吗。那语句不是要写很多吗?
      

  3.   

    -- JUST TRY IT ..
      SELECT NWZSJ_SN, DWZSJ, A.SWZXW, B.SXWMC
        FROM Z_WZSJ A, C_WZXW B
       WHERE A.SWZXW = B.SWZXW
         AND (SBB = (CASE WHEN DWZSJ >= '20000101' AND DWZSJ <= '20050101' THEN 1 WHEN
              DWZSJ >= '20050102' AND DWZSJ <= '20080101' THEN 3 END) OR
             SBB = (CASE WHEN DWZSJ >= '20000101' AND DWZSJ <= '20050101' THEN 2 WHEN
              DWZSJ >= '20050102' AND DWZSJ <= '20080101' THEN 9 END));
      

  4.   

    select nwzsj_sn,dwzsj,a.swzxw,b.sxwmc from z_wzsj a,c_wzxw b where a.swzxw=b.swzxw and sbb in (case when dwzsj>='20000101' and 
              dwzsj <='20050101' then '(1,2)' when dwzsj>='20050102' and dwzsj <='20080101' then '(3,9)' end); 
    ___________________________________________________
    系统认不得 (3,9) 的字段!所以查出来为空,你可以测试用'3' ,'3,9'
    楼上的方法可以一试!
      

  5.   

    create or replace type str_tb is table of varchar2(32767)
     select nwzsj_sn,dwzsj,a.swzxw,b.sxwmc from z_wzsj a,c_wzxw b where a.swzxw=b.swzxw and sbb member of (case when dwzsj>='20000101' and 
              dwzsj <='20050101' then  str_tb('1','2') when dwzsj>='20050102' and dwzsj <='20080101' then str_tb('3','9') end); 
      

  6.   

    kinlin:
       oracle中有member of吗,另外用str_tb好像也不行啊,
      

  7.   

    时间点和使用的版本都是不定的,你要通过SQL写活了,似乎不太容易!
    通过存储过程来来实现,查询每一种情况。
    然后再通过程序把所有的结果合并显示,这种方式比较合理!