Oracle 字段拆分替換在合併成一條

看了網上不少Oracle字段拆分的實例,可是都未能徹底知足要求,或許是我水平不夠未能很好的理解,若是有大神懂得而且願意告知個人,能夠私信我,在這裏真誠的感謝!sql

1.shell

首先創建表並插入測試數據數據庫

drop table col_split;函數

create table col_split測試

(spa

var_id varchar2(6),字符串

var_value varchar2(80)it

);table

 

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

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

相關文章
相關標籤/搜索