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 字符串切割成结果集方法的更多相关文章

  1. Javascript中字符串转换成Date的方法

    //字符串转成Time(dateDiff)所需方法 function stringToTime(string) { var f = string.split(' ', 2); var d = (f[0 ...

  2. js中把字符串转换成number格式方法

    方法主要有三种 转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有 ...

  3. 问题:oracle 字符串转换成日期;结果:[oracle] to_date() 与 to_char() 日期和字符串转换

    to_date("要转换的字符串","转换的格式")   两个参数的格式必须匹配,否则会报错. 即按照第二个参数的格式解释第一个参数. to_char(日期,& ...

  4. jquery中字符串类型转换成整形的方法

    jQuery有一个自带的函数为parseInt():这个函数可以把字符型的数字转换成整形例如: parseInt("1234"); //返回1234 parseInt(" ...

  5. js中字符串处理成数字的方法

    <script> var a="11.1111"; var b="12.2222"; //第一种方法:乘以1的方法 //alert(a*1+b*1) ...

  6. ABAP中将Unicode字符串转换成中文的方法

    以下为示例代码: DATA: LV_UNICODE TYPE STRING,           "Unicode字符串       LV_CHINESE TYPE STRING.      ...

  7. JS 字符串切割成数组

    var cheLin = "字*符*串" // console.log(cheLin) var array = cheLin.split("*");  arra ...

  8. 1 SQL SERVER 实现字符串分割成table的方法

    CREATE FUNCTION [dbo].[fn_SplitStringToTable] ( @p_Input VARCHAR(MAX), @p_Delimeter CHAR() = ',' ) R ...

  9. 使用SQL如何把用逗号等字符隔开的字符串转换成列表(转)

    如何把用逗号等字符隔开的字符串转换成列表,下面依逗号分隔符为例: 比如有一个字符串,其值为:香港,张家港,北京,上海用SQL把这个字符串转换成列表的方法是: 1.方法一 WITH A AS (SELE ...

随机推荐

  1. [BZOJ 1081] [SCOI2005] 超级格雷码 【找规律】

    题目链接:BZOJ - 1081 备注:此题BZOJ上貌似没有 spj ,要把一般顺序的每个格雷码倒着输出...比如 0102 输出为 2010 题目分析 就是按照 Gray 码的生成方法写前几个出来 ...

  2. wget命令解析

           今天一学信息安全的同学让我编写一个软件,功能大致如下:输入网站首页,自动下载该网站所有网页并保存?拿到后感觉属于搜索引擎相关的,说实话我就感觉会用到递归,不过我不会写,百度也没找到资料, ...

  3. Servlet 中使用POI生成Excel

    使用的是poi3.13 http://mvnrepository.com/artifact/org.apache.poi/poi/3.13 import java.io.IOException; im ...

  4. Party

    hdu3062:http://acm.hdu.edu.cn/showproblem.php?pid=3062 题意:中文题. 题解:很明显的2-sat.然后要深刻理解命题和逆否命题.如这一题,c1,c ...

  5. Prefixes and Suffixes

    Codeforces Round #246 (Div. 2) D:http://codeforces.com/contest/432/problem/D 题意:给你一个长度不超过10^5的字符串.要你 ...

  6. java基础随笔-overload和override

    今天重温了一下方法重载和方法重写. 首先是方法重写(override)的几点要求: 1.必须继承父类或者实现某接口的方法. 2.方法名称和参数必须和父类(或者实现的接口方法)完全一致. 3.重写的修饰 ...

  7. mysql优化, 删除数据后物理空间未释放(转载)

    mysql优化, 删除数据后物理空间未释放(转载) OPTIMIZE TABLE 当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小.这是因为删除操作后在数据文件中留下碎片所致.OPTI ...

  8. rspec学习01

    1.安装rspec 2.基本构造 rspec用关键字describe和it,所以我们可以象正常会话一样去表达一个想法. describe方法创建了一个用例组,在describe所在的代码块里,你可以用 ...

  9. Unity Chan Advanced

    1. 8X MSAA 2. SMAA 3. ViewSpace Outline 4. Unity Chan Skin 5. Shift Toon Lighting 6. DOF 7. Bloom

  10. MVC5 学习整理

    一.概述 MVC简介: •       模型(Model) “数据模型”(Model)用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法.“模型”有对数据直接访问的权力,例如对数据库的访问.“ ...