Oracle 字段拆分替换在合并成一条

看了网上不少Oracle字段拆分的实例,可是都未能彻底知足要求,或许是我水平不够未能很好的理解,若是有大神懂得而且愿意告知个人,能够私信我,在这里真诚的感谢!sql

1.shell

首先创建表并插入测试数据数据库

drop table col_split;函数

create table col_split测试

(spa

var_id varchar2(6),字符串

var_value varchar2(80)it

);table

 

1--insert into col_split values('101001','spt001,spt2,spt3,spt004,spt005');sed

2--insert into col_split values('101002','spt001,spt2');

3--insert into col_split values('101005','spt001);

 

方案一:

Substrinstr

Substr 截取字符串

Instr  查找字符串出现的位置标号

 

SELECT var_value,SUBSTR(var_value,1,INSTR(var_value,',')-1)

FROM  col_split ;

出现的状况说明 3条数据是null ,由于找不到‘,’号,因此没有值,一样若是截取第二段的值,第2条数据将会出现null,并且若是字段长度大,分割的多这种写法就会大量的冗余,看起来很是的复杂。

 

方案二:

REGEXP_SUBSTR 函数使用

SELECT REGEXP_SUBSTR (var_value, '[^,]+', 1,ROWNUM)

    FROM col_split

    CONNECT BY ROWNUM <=

LENGTH (var_value) - LENGTH (REPLACE (var_value, ',','')) + 1

当表中只存在一条数据的时候这个能够很好的解决,可是若是多条跟方案一同样会产生null,此时产生想法,循环遍历是否会好些--方案三。

 

方案三:

  利用plsql 循环遍历value值,并进行分割

试着写一种是count条数直接循环,另外一种是使用游标将结果集遍历出来,可是遇到问题在作正则修改而后into的时候,plsql是不容许在这个时候使用收集的。

例子:

 

DECLARE

 

var_values VARCHAR2(80);

 

i NUMBER:=0;

 

TYPE filter IS TABLE OF VARCHAR2(1000);

 

s_filter filter;

 

CURSOR cursor_split IS SELECT var_value FROM col_split;

 

BEGIN

 

  OPEN cursor_split;

 

  LOOP

 

    i := i+1;

 

  dbms_output.put_line(var_values);

 

  FETCH cursor_split INTO var_values;

 

  SELECT REGEXP_SUBSTR (var_values, '[^,]+', 1,ROWNUM)  INTO s_filter

 

    FROM col_split

 

    CONNECT BY ROWNUM <=

 

    LENGTH (var_values) - LENGTH (REPLACE (var_values, ',','')) + 1 ;

 

  EXIT WHEN cursor_split%NOTFOUND;   

 

 END LOOP; 

 

 dbms_output.put_line(i);

 

END;

 

最后想到使用shell处理,shell截取字段在作替换就ok一种直接取字段作替换,第二种是我想说的,spool + sed

Spool将数据库字段按照想要的格式拼接查询,而后生成txt文本。而后在使用sed替换文本内容就OK了。这样表中字符型的字段名称能够对应上说明。看起来更方便。

以下例子:

 

#!/bin/sh

 

sqlplus -s user/userpwd@sid << !

 

set head off  #输出标题域,缺省为on

 

set linesize 30000  #一行的长度

 

set echo off  #显示sqlplus的每一个sql命令自己

 

set feedback off #回显本次sql命令处理记录的行数

 

set pagesize 0 #输出每页行数,24 设定成0 ,为了防止分页

 

set termout off  #显示脚本中的命令的执行结果

 

set trimout on  #去除标准输出每行的拖尾空格,缺省为off

 

set trimspool on  #去除重定向(spool)输出每行的拖尾空格 缺省为off

 

spool /home/expdata.txt  输出定向的位置,写入文件

 

select * from object.table_name where rownum=1;

 

spool off

 

exit

 

!

 sed 's/须要替换掉的/替换的值/g'; 's/须要替换掉的/替换的值/g'  expdata.txt 

 

OK 这是查看expdata.txt 文本文件就OK了。

相关文章
相关标签/搜索