Oracle 字段拆分替换在合并成一条
看了网上很多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 字段拆分替换在合并成一条的更多相关文章
- MySQL把多个字段合并成一条记录的方法
转:http://www.111cn.net/database/mysql/71591.htm MySQL把多个字段合并成一条记录的方法 在mysql中字段合并可以使用很多函数来实现,如可以利用 GR ...
- SQL 列转行,即多行合并成一条
需求:按照分组,将多条记录内容合并成一条,效果如下: 数据库示例: CREATE TABLE [t2]([NID] [bigint] NULL,[district] [nvarchar](255) N ...
- sqlserver中 多条数据合并成一条数据 (stuff 与 for xml path 连用)
SQL 列转行,即多行合并成一条 需求:按照分组,将多条记录内容合并成一条,效果如下: 数据库示例: CREATE TABLE [t2]([NID] [bigint] NULL,[district ...
- MySQL数据库将多条记录的单个字段合并成一条记录
原SQL AND acc.id = accRole.acc_id) AND accRole.role_id = T_PM_ROLE.id ORDER BY acc.id 结果,有一个人有两个角色,如果 ...
- oracle将多条数据合并成一条
select t.col1,t.col2 ,wmsys.wm_concat(t.col3||' ') AS col3 , wmsys.wm_concat(t.col4||'') as col4,w ...
- MYSQL 单表一对多查询,将多条记录合并成一条记录
一.描述: 在MySQL 5.6环境下,应工作需求:将一个表中多条某个相同字段的其他字段合并(不太会表达,有点绕,直接上图) 想要达到的效果: 实现SQL语句: SELECT a.books, GRO ...
- GROUP_CONCAT 将mysql多条数据合并为一条
实现将多条数据合并为一条数据,在mysql中可以通过 GROUP_CONCAT 函数实现 上面是潇leader发我的和工作不相关的小小小需求描述,很明显是要把id和name相同的数据合并为一条,下面按 ...
- Oracle多个字段如何合并成一个字段显示
今天记录一下在oracle中多个字段如何和合并成一个字段,使用到符号“||” 1.组合查询的数据 1)组合前查询的语句 -- 组合前数据的字段 -- select A.MID CATE_ID,A.Co ...
- 一句SQL按照某个字段数值拆分出对应的数据条数,借助数据库常量表【master..spt_values】实现
简介:master..spt_values,数据行拆分简单小技巧 SELECT ProjGUID , CostGUID , SUM(FtAmount) AS FtAmount , BeginMonth ...
随机推荐
- PHP数组和字符串相互转换以及判断字符串长度
这里只介绍最常用的方法: $array=explode(separator,$string); $string=implode(glue,$array); explode() 函数用来将字符串打散成数 ...
- 4.spriing:Bean的生命周期/工厂方法配置Bean/FactoryBean
1.Bean的生命周期 scope:singleton/prototype 1)spring容器管理singleton作用的生命周期,spring能够精确知道Bean合适创建,何时初始化完成,以及何时 ...
- dropout总结
1.伯努利分布:伯努利分布亦称“零一分布”.“两点分布”.称随机变量X有伯努利分布, 参数为p(0<p<1),如果它分别以概率p和1-p取1和0为值.EX= p,DX=p(1-p). 2. ...
- 利用Apache Isis快速原型化-宠物诊所的宠物管理
前言 Apache Isis是DDD方法的一个实现框架. 需求分析 宠物诊所需要记录宠物的资料,包括类型.名字.及其主人. 多个宠物可能同属于一个主人. 宠物可能更换主人. 宠物主人记录姓名,我们可以 ...
- C#中Form的Paint事件响应方法与重载虚方法OnPaint()的区别
Form_Paint()方法是Paint事件的响应方法,OnPaint是可重载的虚方法,OnPaint方法是调用Paint事件的,用哪一个,效果是一样,就看那一个方便了内部是这样实现的: protec ...
- Lua库-bit32库
Global = Global or {}; local bits = {}; function bits.bxor(num1,num2) local ret=bit32.bxor(num1,num2 ...
- 一点一点看JDK源码(一)Collection体系概览
一点一点看JDK源码(一)Collection体系概览 liuyuhang原创,未经允许进制转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 Collection为集 ...
- oracle系列(一)sqlplus命令
该系列是向 韩顺平 老师学习的笔记 高级权限账号:scott pwd sysdba 新建一个 Command Window,也可以 开始,运行 sqlplus 连接命令 --1.0 切换账号 SQ ...
- Visual Studio中添加API断点
如:添加 PostMessageA 断点 {,,USER32.DLL}_PostMessageA@16 //判断为WM_CLOSE消息*(int*)(esp + 8) == 0x0010
- QP之QK原理
QK是一个很小的抢占式微内核调度程序,它专用用QP中. QK的思想源于SST,Miro Samek重写了自己前期编的SST(Super Simple Task)代码. QK循环查询AO队列的状态表QK ...