程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> 工作中用到的oracle字符串分割整理

工作中用到的oracle字符串分割整理

編輯:Oracle教程

oracle部分:

定義類型(用於字符串分割):

create or replace
TYPE "STR_SPLIT" IS TABLE OF VARCHAR2 (4000);

字符串分割函數:

create or replace
FUNCTION splitstr(p_string IN VARCHAR2, p_delimiter IN VARCHAR2)
RETURN str_split
PIPELINED
AS
v_length NUMBER := LENGTH(p_string);
v_start NUMBER := 1;
v_index NUMBER;
BEGIN
WHILE(v_start <= v_length)
LOOP
v_index := INSTR(p_string, p_delimiter, v_start);

IF v_index = 0
THEN
PIPE ROW(SUBSTR(p_string, v_start));
v_start := v_length + 1;
ELSE
PIPE ROW(SUBSTR(p_string, v_start, v_index - v_start));
v_start := v_index + 1;
END IF;
END LOOP;

RETURN;
END splitstr;

 

運行效果:

sql:select CRM.SPLITSTR(',100001240,,100001241,4567890,',',') from dual;

 

sql:SELECT * FROM TABLE(SPLITSTR(',100001240,,100001241,4567890,',','))

 

引申sql:

SELECT * FROM TABLE(SPLITSTR(',100001240,,100001241,4567890,',',')) WHERE column_value IN ('100001240','100001241','2345','234567');

 

 

mybaits+oracle:

sql:(說明:將字符串以特定字符分割,然後拼接成特定記錄,然後和已存在表數據做比較(按特定字段)篩選出不存在的記錄然後再做記錄拼接完成插入操作)

功能說明:可以達到批量插入不用管記錄是否存在,已存在的記錄會被排除在外

insert into CRM.d_business_link (
select t.*, #{account,jdbcType=VARCHAR} ,sysdate from
(SELECT #{customer,jdbcType=VARCHAR} AS HOST,
customers.*,
#{relationship,jdbcType=VARCHAR} AS RELATION
FROM
(SELECT * FROM TABLE(CRM.SPLITSTR(#{selected_dCuscode,jdbcType=VARCHAR},','))
) customers
minus
select Host,CUSTOMER,relation from CRM.d_business_link
)t)

 

下面這個不知道該說設計有問題還是需求變態但也不小心給實現了,真佩服我自己啊,

首先說設計:字典表(應該懂的吧用於動態維護:按分組的形式保存著字典間的映射關系)

      一個表(產品表)用到字典表 這樣設計沒啥問題吧,問題就在於一個字段采用分隔符的形式保存了字典項。

需求:把一批記錄通過字典表轉換成能識別的有意義記錄。

原始記錄:

gjzdgc,tljs,slsl,shsc,jcjs,qljs
gycf,slsl,sydc,ggjz,jcjs,qljs
slsl,shsc,sydc,qljs
gjzdgc,gsgl,yzsc,shsc,jcjs,qljs
grzx,gsgl,qljs
grzx
gjzdgc,gsgl,slsl,shsc,sydc,qljs

目標記錄:

國家重點工程,水利樞紐,商混生產,鐵路工程,機場工程,橋梁工程
水利樞紐,商業地產,公共建築,工業廠房,機場工程,橋梁工程
水利樞紐,商混生產,商業地產,橋梁工程
國家重點工程,高速公路,商混生產,預制生產,機場工程,橋梁工程
個人裝修,高速公路,橋梁工程
個人裝修
國家重點工程,高速公路,水利樞紐,商混生產,商業地產,橋梁工程

sql:

select
(
SELECT WMSYS.WM_CONCAT(dd_infoname)
FROM C_DICTIONARY_DETAILS cdd
WHERE cdd.DD_INFOCODE IN (select * from table(splitstr(p_userful,',')))
) as P_USERFUL,p_userful
,a.*
FROM c_product a;

思路:

1.

SELECT dd_infoname
FROM C_DICTIONARY_DETAILS cdd
WHERE cdd.DD_INFOCODE IN (select * from table(splitstr('gycf,slsl,sydc,ggjz,jcjs,qljs',',')))

2.通過函數WM_CONCAT將記錄轉換成以逗號分割的一條記錄(可好像是10g後才有的,挺強大的需詳細了解請問度娘)

SELECT WM_CONCAT(dd_infoname)
FROM C_DICTIONARY_DETAILS cdd
WHERE cdd.DD_INFOCODE IN (select * from table(splitstr('gycf,slsl,sydc,ggjz,jcjs,qljs',',')))

3.oracle 底層處理了不太清楚

sql:

select
(
SELECT WM_CONCAT(dd_infoname)
FROM C_DICTIONARY_DETAILS cdd
WHERE cdd.DD_INFOCODE IN (select * from table(splitstr(p_userful,',')))
) as P_USERFUL,p_userful
FROM c_product ;

至此ok。完成了

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved