看了网上很多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了。

Oracle 字段拆分替换在合并成一条的更多相关文章

  1. MySQL把多个字段合并成一条记录的方法

    转:http://www.111cn.net/database/mysql/71591.htm MySQL把多个字段合并成一条记录的方法 在mysql中字段合并可以使用很多函数来实现,如可以利用 GR ...

  2. SQL 列转行,即多行合并成一条

    需求:按照分组,将多条记录内容合并成一条,效果如下: 数据库示例: CREATE TABLE [t2]([NID] [bigint] NULL,[district] [nvarchar](255) N ...

  3. sqlserver中 多条数据合并成一条数据 (stuff 与 for xml path 连用)

    SQL 列转行,即多行合并成一条   需求:按照分组,将多条记录内容合并成一条,效果如下: 数据库示例: CREATE TABLE [t2]([NID] [bigint] NULL,[district ...

  4. MySQL数据库将多条记录的单个字段合并成一条记录

    原SQL AND acc.id = accRole.acc_id) AND accRole.role_id = T_PM_ROLE.id ORDER BY acc.id 结果,有一个人有两个角色,如果 ...

  5. oracle将多条数据合并成一条

    select  t.col1,t.col2  ,wmsys.wm_concat(t.col3||' ') AS col3 , wmsys.wm_concat(t.col4||'') as col4,w ...

  6. MYSQL 单表一对多查询,将多条记录合并成一条记录

    一.描述: 在MySQL 5.6环境下,应工作需求:将一个表中多条某个相同字段的其他字段合并(不太会表达,有点绕,直接上图) 想要达到的效果: 实现SQL语句: SELECT a.books, GRO ...

  7. GROUP_CONCAT 将mysql多条数据合并为一条

    实现将多条数据合并为一条数据,在mysql中可以通过 GROUP_CONCAT 函数实现 上面是潇leader发我的和工作不相关的小小小需求描述,很明显是要把id和name相同的数据合并为一条,下面按 ...

  8. Oracle多个字段如何合并成一个字段显示

    今天记录一下在oracle中多个字段如何和合并成一个字段,使用到符号“||” 1.组合查询的数据 1)组合前查询的语句 -- 组合前数据的字段 -- select A.MID CATE_ID,A.Co ...

  9. 一句SQL按照某个字段数值拆分出对应的数据条数,借助数据库常量表【master..spt_values】实现

    简介:master..spt_values,数据行拆分简单小技巧 SELECT ProjGUID , CostGUID , SUM(FtAmount) AS FtAmount , BeginMonth ...

随机推荐

  1. Libevent源码学习笔记一:event2/event.h

    一.libevent标准使用方法: 每个程序使用Libevent必须include <event2/event.h> 头文件,并 传给 -levent  链接器.如果只是想使用主要的eve ...

  2. php签到

    <?php namespace Member\Controller; use Member\Controller\MController; class IndexController exten ...

  3. 使用Nginx 做负载均衡

    Nginx可以作为一个非常高效的负载均衡系统,通过分发HTTP请求到多个应用服务器来提高整个系统的吞吐量,性能和可用性. 负载均衡的算法/机制 下面是Nginx支持的机制 轮询机制 轮询算法 最少连接 ...

  4. 面试准备——(二)专业知识(2)Python

    面试遇到的问题: 滴滴: 1. Python的数据结构 2. list和tuple的区别 3. list中有哪些操作?append和extend的区别? 4. list和dict的却别?dict是有序 ...

  5. CentOS7 安装配置备忘录

    1. 安装 epel 源 $ sudo yum install epel-release.noarch 如果想强制服务器使用 tuna 的镜像,可以如下修改 /etc/yum.repos.d/epel ...

  6. 为GRIDVIEW“删除”列添加确认对话框

    如何为gridview控件里的“删除”列添加一个确认对话框?网上众说纷纭,大致见到了三种解决方案,现归纳如下:1.继承Web.IO里的button控件,为其实现一个IPostback的接口用于回调,具 ...

  7. 【2017001】IList转DataTable、DataTable转IList

    IList转DataTable.DataTable转IList using System; using System.Collections.Generic; using System.Compone ...

  8. DB数据源之SpringBoot+MyBatis踏坑过程(四)没有使用连接池的后果

    DB数据源之SpringBoot+MyBatis踏坑过程(四)没有使用连接池的后果 liuyuhang原创,未经允许禁止转载  系列目录连接 DB数据源之SpringBoot+Mybatis踏坑过程实 ...

  9. React最佳实践(1)

    React最佳实践不敢妄谈,但最差实践非知乎莫属. 旧版知乎看起来土了点,但体验流畅,起码用起来舒服. 新版知乎看起来UI现代化,技术实现上采用了React,但是可能因为知乎缺钱,请不起高水平的前端工 ...

  10. Yii2 联表查询数据丢失,即出现主键覆盖情况的解决方法

    前段时间做项目,遇到一个问题,用yii2的AR连表查询数据的时候,理应该查出来更多的数据,但是实际得到的只有部分数据: 例如,有这么一个查询: $query = OperaHotelRoom::fin ...