不明白楼主的意思,是要取几位呢? 6A 、 6AC、 6A1??
怎么样算重复的数据呢?2位还是3位?
如果是固定的位数的话,那么用SUBSTR取固定的长度可好?
怎么样算重复的数据呢?2位还是3位?
如果是固定的位数的话,那么用SUBSTR取固定的长度可好?
解决方案 »
- 急 存储过程出现错误:警告创建的过程带有编译错误
- 一个小问题
- 两个库,一样的表,一个库的表数据改变了,如何更新另一个表?
- ||和concat有区别吗
- 怎么突破sqlldr的char类型的长度限制
- 求一条sql语句:如果这个人有2个或以上的记录,则把他列出来
- 存储过程里面不可以用create table语句吗?我怎样才能动态建表?急....
- 有sqlserver2000基础,学oracle用什么书最好?
- oracle8i客户端产生大量临时文件导致死机怎么办?
- 删表时提示:resource busy and acquire with NOWAIT specified???
- object browser windows 注册码?????急急!!!!
- 什么是左联,右联一般的书上好象没有讲!!!!!哪位能解释一下
这样说吧,上面的数据例子中TB表中的6AC000只能与 TA表中的 20 6AC 匹配,而不能与 10 6A匹配.
帮你顶一下!
输入 dy 的值: '6AC000'
原值 1: select max(dyqz) from ta where &dy like dyqz||'%'
新值 1: select max(dyqz) from ta where '6AC000' like dyqz||'%'MAX(D
-----
6ACSQL> select max(dyqz) from ta where &dy like dyqz||'%';
输入 dy 的值: '6A0000'
原值 1: select max(dyqz) from ta where &dy like dyqz||'%'
新值 1: select max(dyqz) from ta where '6A0000' like dyqz||'%'MAX(D
-----
6A
----
create table ta((DMQZ varchar2(50),DYQZ varchar2(50)));create table tb((DM varchar2(50),re varchar2(50)));----CREATE OR REPLACE PROCEDURE ERICY
IS
CURSOR TESTA IS
SELECT * FROM TA
ORDER BY DYQZ DESC;
TT TA%ROWTYPE;
BEGIN
if TESTA%ISOPEN then close TESTA; end if;
open TESTA;
update tb set re = null;
COMMIT;
loop
fetch TESTA into tt;
exit when TESTA%notfound;
begin
UPDATE TB
SET RE = REPLACE(DM,TT.DYQZ,TT.DMQZ)
WHERE RE IS NULL
AND SUBSTR(DM,1,LENGTH(TT.DYQZ))=TT.DYQZ;
COMMIT;
end;
end loop;
close TESTA;
END;
/begin
ericy;
end;-----re中存放的事结果select re from tb;
SELECT * FROM TB
DM RE
-------------------------------------------------- -----------------------------
6A0000 100000
6AC000 20000
6A1111 101111
7B0000 300000
4 rows selected搞定
:)
create table ta(dmqz varchar2(10),dyqz varchar2(10));
create table tb(dm varchar2(20));
insert into ta values('10','6A');
insert into ta values('210','6AC');
insert into ta values('30','7B'); insert into tb values('6A0000');
insert into tb values('6A1111');
insert into tb values('7B0000');
commit; select dmqz || substr(dm,length(dyqz)+1)
from (
select ta.dmqz,ta.dyqz,tb.dm,
dense_rank() over (partition by tb.dm order by ta.dyqz desc) rn
from ta,tb where instr(dm,dyqz) > 0
) where rn = 1;
return varchar2
as
str varchar2(10):='0';
cursor t_sor is
select dm from tb where instr(dm,p_dyqz)>0;
begin
for v_sor in t_sor loop
if substr(v_sor.dm,1,length(p_dyqz))=p_dyqz then
if substr(v_sor.dm,length(p_dyqz)-length(v_sor.dm))-str=0 then
return substr(v_sor.dm,length(p_dyqz)-length(v_sor.dm));
end if;
end if;
end loop;
end;
/
SELECT dmqz||get_dm(dyqz) from ta;