表tab1中有如下两条记录, 
      字段A          字段B 
记录1:0121(大类)    60.00 
记录2:0121001(小类)  70.00 表tab2中,有一字段c,有可能是4位,有可能是6位,与tab1中的A字段是相等的,现在的要求是先要满足6位的,如果6位的记录没有,就找4位的。也就是说,如果 where tab2.c=tab1.A 没有找到匹配的记录,就用where substr(tab2.c,0,4)=tab1.A 也就是先找小类,如果小类不满足,就继续找大类,要求这个条件写在一个SQL语句里。 
也就是像这样的: 
where (tab2.c=tab1.A or substr(tab2.c,1,4)=tab1.A 
但是,上面这样会把两条记录都查出来,我要的结果是如果tab2.c=tab1.A满足的话,就取出70.00,不再执行substr(tab2.c,1,4)=tab1.A了。 谢谢

解决方案 »

  1.   

    select * from tab1 a ,tab2  where tab1.a=case when exists (select 1 from tab2 where c=a.a) then tab2.c else substr(tab2.c,1,4) end;
      

  2.   

    --使用decode函数,试一下:select * from tab1,tab2 where 1 = decode(tab1.a,tab2.c,1,substr(tab2.c,1,4),1,0);
      

  3.   

    -- TRY IT ..
    SQL> SELECT * FROM TABLE1;A                             B
    -------------------- ----------
    0121                      60.00
    012101                    70.00
    0122                     110.00
    012301                   230.00
    012303                    45.00
    0123                      80.006 rows selectedSQL> SELECT * FROM TABLE2;C
    --------------------
    012101
    0122
    0123SQL> SELECT A, B
      2    FROM (SELECT T1.*,
      3                 ROW_NUMBER() OVER(PARTITION BY SUBSTR(T1.A, 0, 4) ORDER BY T1.A DESC) RN
      4            FROM TABLE1 T1) TT
      5   WHERE EXISTS (SELECT 1
      6            FROM TABLE2 T2
      7           WHERE DECODE(T2.C, TT.A, T2.C, SUBSTR(TT.A, 0, 4)) =
      8                 DECODE(T2.C, TT.A, T2.C, SUBSTR(T2.C, 0, 4)))
      9     AND RN = 1;A                             B
    -------------------- ----------
    012101                    70.00
    0122                     110.00
    012303                    45.00
      

  4.   


    --改了一下:select a,b from tab1 
           where length(a)=(select max(length(m.a)) 
                                   from tab1 m,tab2 n 
                                   where 1 = decode(m.a,
                                                    n.c,
                                                    1,
                                                    substr(n.c,1,4),
                                                    1,
                                                    0
                                                    )
                            )
    ;