zoukankan      html  css  js  c++  java
  • 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);

    方案一:

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

  • 相关阅读:
    HDU-5980
    HDU-5974
    HDU-5979
    关于position的定位
    javascript学习笔记w3chool
    表单相关css技巧
    fis压缩工具的使用
    将HTML页面内容存入json数组
    中介PHP连接前台HTML与数据库MySQL
    lesscss的使用
  • 原文地址:https://www.cnblogs.com/sun-chao/p/6756354.html
Copyright © 2011-2022 走看看