看了网上很多Oracle字段拆分的实例,但是都未能完全满足要求,或许是我水平不够未能很好的理解,如果有大神懂得并且愿意告知我的,可以私信我,在这里真诚的感谢!

1.

首先建立表并插入测试数据

drop table col_split;

create table col_split

(

var_id varchar2(6),

var_value varchar2(80)

);

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

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

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

方案一:

Substr和instr

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了。

最新文章

  1. EventAggregator, EventBus的实现
  2. Jquery获取select,dropdownlist,checkbox下拉列表框的值
  3. mysql 语句执行顺序问题
  4. 在后台对GameObject进行&quot;创建&quot;||&quot;删除&quot;动作
  5. Java——(三)Collection之Set集合、HashSet类
  6. 原创翻译:蓝牙(BLE)for iOS
  7. What qualities characterize a great PhD student
  8. VMWare网络链接三种方式
  9. OpenLayers 3 的地图基本操作
  10. Java线程安全 关于原子性与volatile的试验
  11. jQuery.validate 的form校验
  12. linux下更改ssh登录前的banner信息
  13. javaweb学习总结(七)——HttpServletResponse对象(一)(转)
  14. sqlzoo:5
  15. mybatis-spring和spring版本搭配问题
  16. 学习Acegi应用到实际项目中(7)- 缓存用户信息
  17. 【题解】Hanoi
  18. objective-C 的内存管理之-自动释放池(autorelease pool)
  19. php操作redis的两个个小脚本
  20. CentOS下查看最后登录的用户信息以及LOG记录

热门文章

  1. PHP-------ajax返回值 返回JSON 数据
  2. LwIP协议栈开发嵌入式网络的三种方法分析
  3. ARM MDK 编译产生:RO、RW和ZI DATA说明
  4. Winodws SNMP服务安装和配置(Windows 2003 & 2008 R2)
  5. 轻量ORM-SqlRepoEx (六) JOIN
  6. 工具 | Axure基础操作 No.4
  7. 『ACM C++』 PTA 天梯赛练习集L1 | 048-49
  8. 19-3-5Python中列表、元组、以及range
  9. Django的MVT的思路
  10. Windows系统常见问题