问题前提:
ID为主键表:
ID(CHAR 4), CD1(CHAR 1000),CD2(CHAR 1000),CD3(CHAR 1000),CD4(CHAR 1000),CD5(CHAR 1000),CD6(CHAR 1000),CD7(CHAR 1000),CD8(CHAR 1000),CD9(CHAR 1000),CD10(CHAR 1000) 1:表的CD1到CD10里面,原则是先从CD1开始有值,如果CD1值没填满的话,那后面的项目肯定都没有值,如果CD1的1000位满的话,CD2又没值的话,那CD2跟后面的项目里面也都没有值. 2:在有值的CD项目中,每一个项目里面又以4个字节为一个整体的长文字列,这4个字节还可能会重复出现.想要查出的内容:
以ID为主键的,有值项目间跟项目内的4个字节不重复的文字列.
ID为主键表:
ID(CHAR 4), CD1(CHAR 1000),CD2(CHAR 1000),CD3(CHAR 1000),CD4(CHAR 1000),CD5(CHAR 1000),CD6(CHAR 1000),CD7(CHAR 1000),CD8(CHAR 1000),CD9(CHAR 1000),CD10(CHAR 1000) 1:表的CD1到CD10里面,原则是先从CD1开始有值,如果CD1值没填满的话,那后面的项目肯定都没有值,如果CD1的1000位满的话,CD2又没值的话,那CD2跟后面的项目里面也都没有值. 2:在有值的CD项目中,每一个项目里面又以4个字节为一个整体的长文字列,这4个字节还可能会重复出现.想要查出的内容:
以ID为主键的,有值项目间跟项目内的4个字节不重复的文字列.
解决方案 »
- 删除同义词报错
- ORA:00918出错,请求帮忙解决
- 将表移动到另一个表空间,除了会使索引失效,还会引起其它什么问题吗?
- 急!查询写不到,请帮助
- oracle中怎样写关联表?
- 一小小查询问题!解决有分啊!呵呵
- 一般程序使用的oracle用户应该给什么权限合适?
- 接触ORACLE已经半年多了,现在想自己实践一个案例,从应用程序到ORACLE数据库,以及中间的接口层,哪里有这样的例子,或者我可以帮助各位
- 如何获得oracle中一张表的前十个记录。
- ora-31032 XML语法分析失败 出现错误 LPX-217(在encoding an XML docment to CSX 期间)
- 求助,oracle数据库表空间的设计原则
- oracle的。。问题
没有分隔符,
举个例子:
ID CD1 CD2.....
1234 abcdefghhjieabcd NULL如果我用1234来查询的话,要得到的文字列是abcdefghhjie
消除了一个重复的4字节的abcd
for循环查找每4个字节是否在后面的字符串中出现,并且出现的位置mod(position,4)=1
1.先定义一个临时表,如:
create global temporary table t_temp(cd varchar(4);)2.可以先定义一个变量,初始值为1,然后从1遍历CD到的长度,如下:
for i in 1..length(CD)
loop
//每四位截取,插入到 临时表
insert into t_temp select substr(CD,i,i+3) from table_name;
end loop;
3.从临时表中过滤掉重复的数据进行操作
以上你可以封装一个函数或者存贮过程多次调用
SQL> select * from test11;
ID CD1 CD2
--- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
1 1234asdf5678 QWERasdfPOIU
2 QWERasdfPOIU 1234asdf5678
SQL>
SQL> SELECT ID,replace(wm_concat(chr),',','') FROM
2 (
3 SELECT ID,MIN(colnum),MIN(rn),chr FROM
4 (SELECT ID,1 colnum ,rn, substr(cd1,rn*4-3,4) chr FROM test11 a,(SELECT ROWNUM rn FROM dual CONNECT BY ROWNUM<=250 )b
5 UNION ALL
6 SELECT ID,2 colnum ,rn, substr(cd2,rn*4-3,4) chr FROM test11 a,(SELECT ROWNUM rn FROM dual CONNECT BY ROWNUM<=250 )b )
7 GROUP BY ID ,chr
8 ORDER BY ID,MIN(colnum),MIN(rn)
9 ) WHERE chr<>'1234'
10 GROUP BY ID;
ID REPLACE(WM_CONCAT(CHR),',','')
--- --------------------------------------------------------------------------------
1 asdf5678QWERPOIU
2 QWERasdfPOIU5678
SQL>
v_length number := length(p_str);
v_result varchar2(1000) := '';
i number := 1;
begin
if v_length = 4 then
v_result := p_str;
else
while i <= v_length - 4 loop
if nvl(instr(v_result, substr(p_str, i, 4), 1), 0) = 0 then
v_result := v_result || substr(p_str, i, 4);
end if;
i := i + 4;
end loop;
end if;
return v_result;end;
测试:select str_f('abcdefghhjieabcd') from dual; --abcdefghhjie