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/[email protected] << !

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

时间: 2024-11-09 15:02:29

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

MySQL合并列,集合中某个字段合并成一条

默认查询: SELECT floor,place_code FROM ticket; 合并列: SELECT concat(floor,',',place_code) floor FROM ticket; 合并成一条: SELECT group_concat(floor) floor FROM ticket;

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

需求:按照分组,将多条记录内容合并成一条,效果如下: 数据库示例: CREATE TABLE [t2]([NID] [bigint] NULL,[district] [nvarchar](255) NULL,[town] [nvarchar](255) NULL); insert into t2 values(1,'淮上区','曹老集镇'); insert into t2 values(2,'淮上区','淮滨街道'); insert into t2 values(3,'淮上区','梅桥乡');

oracle将多条数据合并成一条

select  t.col1,t.col2  ,wmsys.wm_concat(t.col3||' ') AS col3 , wmsys.wm_concat(t.col4||'') as col4,wmsys.wm_concat(t.col5||'') as col5,wmsys.wm_concat(t.col6||'') as col6 from tablename t GROUP BY  t.col1,t.col2 ;

ArcMap合并道路 -- 将路的几段合并成一条完整的道路

#1: 用 Arctoolbox\Data Management Tools\Generalization\dissolve 工具 #2: Options:dissolve field 项选"合并字段"[根据那些字段做合并,也就是最后保留的字段].如果其他字段也想带到结果的话,可以在statistics field里选一下,设置好规则[可以设置的规则有限,也就是求和.平均数.最大.最小之类的]. #3:Special tips:下面有个 create multipart feature

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

简介:master..spt_values,数据行拆分简单小技巧 SELECT ProjGUID , CostGUID , SUM(FtAmount) AS FtAmount , BeginMonth , EndMonth , ( EndMonth - BeginMonth ) + 1 AS RowCountNum FROM cb_Loan2Cost WHERE LoanGUID = '6D88EB2B-18FA-4A4A-9ADB-9873B0F14381' GROUP BY ProjGUID

Birt中实现字段拆分为表的另一种方法

来源:     http://developer.actuate.com/community/forum/index.php?/topic/36204-split-data-row/. 将字段拆分为多条记录,可以用存储过程或报表脚本来实现,但代码比较复杂,这种情况下可以用集算器来辅助报表工具,下面用例子来说明. 库表data有两个字段,需要将ANOMOALIES字段按空格拆分为多个字符串,每个字符串和原ID字段形成新的记录.源数据如下: 集算器代码: A1:查询数据库. A2:拆分ANOMALI

使用AWR生成一条sql的执行统计报告

我们都知道Oracle的AWR报告是一个很强大的功能通过分析AWR报告可以打出Oracle数据运行过程中出现的问题和可能存在的隐患.但是AWR报告中没有关于单个SQL执行计划.统计信息的详细描述,但不代表AWR不能提供这种功能. 本文介绍的是如何使用AWR报告生成一条sql的详细执行统计报告. 实验环境11.2.0.4 1.调整AWR关于SQL收集的设置,调整的目的是因为默认情况下AWR并非捕获所有的sql语句,此调整是为了让AWR可以收集实验过程中的SQL语句 [email protected

[lua, mysql] 将多条记录数据组合成一条sql插入语句(for mysql)

-- 演示将多条记录数据组合成一条sql插入语句(for mysql) function getTpl0(tname) -- 获取表各个字段 local t = { tpl_pack = {"packId","itemId","`group`","num","rate","rateType"}, } for k, v in pairs(t) do if tname == k then r

使用SQL语句将数据库中的两个表合并成一张表

select * into 新表名 from (select * from T1 union all select * from T2)  这个语句可以实现将合并的数据追加到一个新表中. 不合并重复数据 select * from T1 union all select * from T2  合并重复数据 select * from T1 union select * from T2      两个表,表1 表2 如果要将 表1的数据并入表2用以下语句即可 insert into 表2(字段1,