oracle 字符串切割成结果集方法
oracle字符串切割几种方式
- 方法一:
SELECT COLUMN_VALUE FROM TABLE(SYS.ODCIVARCHAR2LIST('1','2','3','4','5'));
- 方法二:
select regexp_substr('1,2,3,4,5','[^,]+',1,rownum)
from dual
connect by rownum<=length('1,2,3,4,5')-length(replace('1,2,3,4,5',','))+1
- 方法三:使用自定义函数+table()实现字符串切割
CREATE OR REPLACE TYPE Tbl_StrSplit IS TABLE OF VARCHAR2 (32767);
--实现字符串的切割成数据表
Function Fn_Split(
P_String In Clob,
P_Delimiter In Varchar2
)
Return Tbl_StrSplit; /*本函数实现字符串的切割操作,通过table()方式返回数据集*/
Function Fn_Split(P_String In Clob, P_Delimiter In Varchar2)
Return Tbl_StrSplit
Is
L_j Pls_Integer := 0;
L_i Pls_Integer := 1;
L_StringLength Pls_Integer := 0;
L_DelimiterLength Pls_Integer := 0;
L_CutString Clob := '';
Tbl_SplitItem Tbl_StrSplit := Tbl_StrSplit ();
Begin
L_StringLength := Length (P_String);
L_DelimiterLength := Length (P_Delimiter);
While L_j < L_StringLength Loop
L_j := Instr (P_String, P_Delimiter, L_i);
If L_j = 0 Then
L_j := L_StringLength;
L_CutString := SUBSTR (P_String, L_i);
Tbl_SplitItem.EXTEND;
Tbl_SplitItem (Tbl_SplitItem.COUNT) := L_CutString;
If L_i >= L_StringLength Then
Exit;
End If;
Else
L_CutString := SUBSTR (P_String, L_i, L_j - L_i);
L_i := L_j + L_DelimiterLength;
Tbl_SplitItem.EXTEND;
Tbl_SplitItem (Tbl_SplitItem.COUNT) := L_CutString;
End If;
End Loop;
Return Tbl_SplitItem;
End Fn_Split;
总结:(1)Table函数将数组里的内容通过SQL语句查询出来;
(2)ODCIVARCHAR2LIST 在9I 及以上版本中均可使用。在9I中可通过创建TYPE,10G及以上直接使用SYS.ODCIVARCHAR2LIST;
(3)ODCIVARCHAR2LIST 适用于字符集,不适用单个字符串,如果是单个字符串,可以通过参考2中(如下)方法实现。
- 方法四使用正则表达式
Declare WITH test AS (
SELECT '1,2,3,4,5,10,11,112,455,45,5,52,5,5,5,5,5,5,5,5,5,,5,4,87,8,56,78,8,,,5' AS STR FROM DUAL
)
SELECT DISTINCT REGEXP_SUBSTR(STR, '[^,]+', 1, LEVEL)
FROM test
CONNECT BY ROWNUM <= 1000005;
该种正则表达式切割方法不够灵活,且随着level数值变大,效率不断下降。
- 方法五: 使用connect by
WITH T AS (
SELECT '1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20' AS STR FROM DUAL
)
SELECT STR1
FROM
(
SELECT DISTINCT
SUBSTR(T.CA,INSTR(T.CA, ',', 1, C.LV) + 1,
INSTR(T.CA, ',', 1, C.LV + 1) -(INSTR(T.CA, ',', 1, C.LV) + 1)) AS STR1
FROM (SELECT ',' || STR || ',' AS CA,LENGTH(STR || ',') -NVL(LENGTH(REPLACE(STR, ',')), 0) AS CNT FROM T) T,
(
SELECT LEVEL LV
FROM DUAL
CONNECT BY LEVEL <= 1000000
) C
WHERE C.LV <= T.CNT
ORDER BY STR1
);
该种方法的level的数值也不能太大,否则会提示no enough memory for connect by operation
- 方法六:使用oracle的自定义type类型+管道函数table()实现带有自然数索引的分割函数生成结果集
第一步先创建自定义的type类型"OBJTYPE_VAR"
CREATE OR REPLACE TYPE "OBJTYPE_VAR" FORCE AS OBJECT
(
serialNo NUMBER,
field0 VARCHAR2(1000),
field1 VARCHAR2(1000)
)
第二步定义分割函数
--声明程序包
Create Or Replace Package PKG_Stm_Common Is
--声明<pre code_snippet_id="94384" snippet_file_name="blog_20131203_8_6369260" name="code" class="sql"> Obj_Items类型 的Obj_Items变量
TYPE Obj_Items Is Table Of ObjType_Var; --实现字符串的切割成数据表,带有自然数索引
Function Fn_SplitWithIndex(
P_String In Clob,
P_Delimiter In Varchar2
)
Return Obj_Items Pipelined;
End PKG_Stm_Common; --定义程序包体
create or replace package body PKG_Stm_Common is
/*本函数实现字符串的切割操作,通过table()方式返回数据集*/
Function Fn_SplitWithIndex(P_String In Clob, P_Delimiter In Varchar2)
Return Obj_Items Pipelined
Is
L_Index Pls_Integer := 1;
L_j Pls_Integer := 0;
L_i Pls_Integer := 1;
L_StringLength Pls_Integer := 0;
L_DelimiterLength Pls_Integer := 0;
L_CutString Clob := '';
Tbl_SplitItem ObjType_Var := ObjType_Var (null,null,null);
Begin
L_StringLength := Length (P_String);
L_DelimiterLength := Length (P_Delimiter);
While L_j < L_StringLength Loop
L_j := Instr (P_String, P_Delimiter, L_i);
If L_j = 0 Then
L_j := L_StringLength;
L_CutString := SUBSTR (P_String, L_i);
Tbl_SplitItem := ObjType_Var(
L_Index,
L_CutString,
null
);
Pipe Row(Tbl_SplitItem);
If L_i >= L_StringLength Then
Exit;
End If;
Else
L_CutString := SUBSTR (P_String, L_i, L_j - L_i);
L_i := L_j + L_DelimiterLength;
Tbl_SplitItem := ObjType_Var(
L_Index,
L_CutString,
null
);
Pipe Row(Tbl_SplitItem);
End If;
L_Index := L_Index + 1;
End Loop;
Return;
End Fn_SplitWithIndex;
End PKG_Stm_Common;
调用方法:
select *
from table(PKG_Stm_Common.Fn_Split('语文,数学,英语,物理,化学',','))
查询出来的结果
SERIALNO FIELD0 FIELD1
1 1 语文
2 2 数学
3 3 英语
4 4 物理
5 5 化学
oracle 字符串切割成结果集方法的更多相关文章
- Javascript中字符串转换成Date的方法
//字符串转成Time(dateDiff)所需方法 function stringToTime(string) { var f = string.split(' ', 2); var d = (f[0 ...
- js中把字符串转换成number格式方法
方法主要有三种 转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有 ...
- 问题:oracle 字符串转换成日期;结果:[oracle] to_date() 与 to_char() 日期和字符串转换
to_date("要转换的字符串","转换的格式") 两个参数的格式必须匹配,否则会报错. 即按照第二个参数的格式解释第一个参数. to_char(日期,& ...
- jquery中字符串类型转换成整形的方法
jQuery有一个自带的函数为parseInt():这个函数可以把字符型的数字转换成整形例如: parseInt("1234"); //返回1234 parseInt(" ...
- js中字符串处理成数字的方法
<script> var a="11.1111"; var b="12.2222"; //第一种方法:乘以1的方法 //alert(a*1+b*1) ...
- ABAP中将Unicode字符串转换成中文的方法
以下为示例代码: DATA: LV_UNICODE TYPE STRING, "Unicode字符串 LV_CHINESE TYPE STRING. ...
- JS 字符串切割成数组
var cheLin = "字*符*串" // console.log(cheLin) var array = cheLin.split("*"); arra ...
- 1 SQL SERVER 实现字符串分割成table的方法
CREATE FUNCTION [dbo].[fn_SplitStringToTable] ( @p_Input VARCHAR(MAX), @p_Delimeter CHAR() = ',' ) R ...
- 使用SQL如何把用逗号等字符隔开的字符串转换成列表(转)
如何把用逗号等字符隔开的字符串转换成列表,下面依逗号分隔符为例: 比如有一个字符串,其值为:香港,张家港,北京,上海用SQL把这个字符串转换成列表的方法是: 1.方法一 WITH A AS (SELE ...
随机推荐
- 自动生成makefile的脚本
如果需要测试某一个特性,写了一个test.cpp 某天又增加了一个utils.cpp,依此类推,测试文件越来越多 每次测试时都要手动维护一个makefile实在是不明智的 于是萌生了用脚本自动维护的念 ...
- Android ListView列表控件的简单使用
ListView 列表是我们经常会使用的控件, 如果想要自定义里面的显示的话是挺麻烦的, 需要新建XML.Class SimpleAdapter这两个文件, 较为麻烦. 如果我们只是想显示两.三行文字 ...
- iOS便捷开发工具分享
项目/代码优化工具 1.objec_dep,可以了解项目中各个类的关联信息,了解项目中无效文件,知道双向应用的文件. 下载地址: https://github.com/nst/objc_dep 2.b ...
- 【itext】7步制作兼容各种文档格式的Itext5页眉页脚 实现page x pf y
itext5页眉页脚工具类,实现page x of y 完美兼容各种格式大小文档A4/B5/B3,兼容各种文档格式自动计算页脚XY轴坐标 鉴于没人做的这么细致,自己就写了一个itext5页眉页脚工具类 ...
- Illustrator软件中eps和ai格式的区别
转自Illustrator软件中eps和ai格式的区别 AI是ILL特有的格式,EPS格式是在排版领域经常使用的格式.AI中的位图图像是用链接的方式存储,EPS格式则将位图图像包含于文件中.对于含有相 ...
- 从零开始制作jffs2文件系统
JFFS2 是一个开放源码的项目(www.infradead.org). 它是在闪存上使用非常广泛的读/写文件系统,在嵌入式系统中被普遍的应用. 1. 安装mkfs工具 MTD主页:htt ...
- spring 动态数据源
1.动态数据源: 在一个项目中,有时候需要用到多个数据库,比如读写分离,数据库的分布式存储等等,这时我们要在项目中配置多个数据库. 2.原理: (1).spring 单数据源获取数据连接过程: ...
- Xstream之常用方式与常用注解
示例代码 Blog teamBlog = new Blog(new Author("Guilherme Silveira")); teamBlog.add(new Entry(&q ...
- 【CF】509E Pretty Song
数学规律题,很容易计算的.以初始测试数据3为例.Str Y I S V O W E L--------------------------Len 1 2 3 4 | 5 6 7 8Y ...
- 了解 Windows Azure 存储计费 – 带宽、事务和容量
我们收到关于如何估算 Windows Azure存储成本,以便了解如何更好地构建一个经济有效的应用程序的问题.在本文中,我们将从带宽.事务和容量这三种存储成本的角度探讨这一问题. 使用 Wind ...