表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了。 谢谢
字段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了。 谢谢
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
--改了一下: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
)
)
;