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. 原生js实现tab选项卡里内嵌图片滚动特效代码

    <!DOCTYPE HTML><html lang="en-US"><head><meta charset="UTF-8&quo ...

  2. js将数字转换成大写的人民币表达式

    function changeNumMoneyToChinese(money) { var cnNums = new Array("零", "壹", " ...

  3. 4d tensor

    偶然在一个ppt中看到了如下关于tensor的解释,清晰明白,所以post在这里,以备后续查看 根据这个理解: theano中的input(4d tensor):[mini-batch size, n ...

  4. 初识EL表达式

    1.EL最初出现在JSTL,后来引入JSP 2.核心作用:减少JSp中Java代码数量,同时方便修改 3.算术.逻辑.关系符号都是两种,防止出现歧义,比如:/和div,%和mod,>=和ge,相 ...

  5. appFramework在三星某些机型上的兼容问题

    有个问题困扰了安卓哥好几天 一个带有fixed抬头的列表页,在向上swipe的时候,有一定概率会把整个画面滚动上去,就连fixed的部分也移动了. 于是哥觉得是webview的问题,找了各种选项,禁用 ...

  6. Javascript禁止网页复制粘贴效果,或者复制时自动添加来源信息

    一.禁止复制 使用方法:在oncopy事件中return false oncopy="return false;" 1.禁止复制网页内容 <body oncopy=" ...

  7. css li 列表

    ul,li{list-style-type:none;padding:0;margin:0}

  8. Batik - 将svg转换成其他格式图片或PDF - [导出服务器配置] 导出服务器原理解析

    导出服务器原理解析 Highcharts图表导出(或下载)本质上是将SVG代码转换为不同文件格式的过程,用到的工具是batik,所以所谓导出服务器,只不过是调用batik,将SVG代码转换并下载.下图 ...

  9. bzoj2729

    一看就知道是数学题,考虑插空法由于老师只有两人,所以先对老师进行插空这里考虑两种情况:1.两个老师站在同一处,即两个男生之间站了两个老师这时候需要一个女生站在两个老师之间,再对女生插空,根据乘法原理即 ...

  10. Android手机应用程序开发环境配置(Eclipse+Java+ADT)

    参考: Java手机游戏开发实例简明教程 http://dev.10086.cn/blog/?uid-82940-action-viewspace-itemid-1772 Eclipse下载: htt ...