`

oracle split去逗号,行列转换

 
阅读更多

1.针对  '1','2','3','4','5'(逗号在字符串外面)

[sql] view plain copy
 
 print?
  1. SQL> SELECT COLUMN_VALUE  FROM TABLE(SYS.ODCIVARCHAR2LIST('1','2','3','4','5'));  
  2.   
  3. COLUMN_VALUE  
  4. --------------------------------------------------------------------------------  
  5. 1  
  6. 2  
  7. 3  
  8. 4  
  9. 5  


2.针对'1,2,3,4,5'(逗号在字符串里面)

[sql] view plain copy
 
 print?
  1. SQL> select regexp_substr('1,2,3,4,5','[^,]+',1,rownum) from dual  
  2.   2  connect by rownum<=length('1,2,3,4,5')-length(replace('1,2,3,4,5',','))+1  
  3.   3  ;  
  4.   
  5. REGEXP_SUBSTR('1,2,3,4,5','[^,  
  6. ------------------------------  
  7. 1  
  8. 2  
  9. 3  
  10. 4  
  11. 5  


3.使用函数

[sql] view plain copy
 
 print?
  1. CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000);  

 

[sql] view plain copy
 
 print?
  1. CREATE OR REPLACE FUNCTION fn_split (p_str IN CLOB, p_delimiter IN VARCHAR2)  
  2.  RETURN ty_str_split  
  3. IS  
  4.   j INT := 0;  
  5.   i INT := 1;  
  6.   len INT := 0;  
  7.   len1 INT := 0;  
  8.   str VARCHAR2 (4000);  
  9.   str_split ty_str_split := ty_str_split ();  
  10. BEGIN  
  11.   len := LENGTH (p_str);  
  12.   len1 := LENGTH (p_delimiter);  
  13.   
  14.   WHILE j < len  
  15.   LOOP  
  16.     j := INSTR (p_str, p_delimiter, i);  
  17.   
  18.     IF j = 0  
  19.     THEN  
  20.         j := len;  
  21.         str := SUBSTR (p_str, i);  
  22.         str_split.EXTEND;  
  23.         str_split (str_split.COUNT) := str;  
  24.   
  25.         IF i >= len  
  26.         THEN  
  27.           EXIT;  
  28.         END IF;  
  29.     ELSE  
  30.         str := SUBSTR (p_str, i, j - i);  
  31.         i := j + len1;  
  32.         str_split.EXTEND;  
  33.         str_split (str_split.COUNT) := str;  
  34.     END IF;  
  35.   END LOOP;  
  36.   
  37.   RETURN str_split;  
  38. END fn_split;  


测试:

[sql] view plain copy
 
 print?
  1. <p>SQL> select * from table(fn_split('1,2,3,4,5',','));    --第二个单引号中是前面字符串中需要被分隔的字符</p><p>COLUMN_VALUE  
  2. --------------------------------------------------------------------------------  
  3. 1  
  4. 2  
  5. 3  
  6. 4  
  7. 5</p><p>SQL> select * from table(fn_split('1,2,3,4。5','。'));</p><p>COLUMN_VALUE  
  8. --------------------------------------------------------------------------------  
  9. 1,2,3,4  
  10. 5</p><p>SQL></p>  


参考:

http://www.itpub.net/thread-1346178-1-1.html

众大牛们已经总结了行列转换的若干方法。今天发现了一种新的方法( ),和大家分享下。
1.SYS.ODCIVARCHAR2LIST:
SELECT COLUMN_VALUE  FROM TABLE(SYS.ODCIVARCHAR2LIST('1','2','3','4','5'));
COLUMN_VALUE
--------------------------------------------------------------------------------
1
2
3
4
5
Oracle 10G 以上版本才支持SYS.ODCIVARCHAR2LIST,其实SYS.ODCIVARCHAR2LIST只不过是一个TYPE,
所以在9I版本中可以通过创建一个TYPE来使用该功能:
CREATE OR REPLACE TYPE MY_ODCIVARCHAR2LIST AS VARRAY(32767) OF VARCHAR2(4000);

SELECT COLUMN_VALUE  FROM TABLE(MY_ODCIVARCHAR2LIST('1','2','3','4','5'));
COLUMN_VALUE
--------------------------------------------------------------------------------
1
2
3
4
5
但是,当'1','2','3','4','5'  作为一个字符串('1,2,3,4,5')就没有办法转换了:
SELECT COLUMN_VALUE  FROM TABLE(MY_ODCIVARCHAR2LIST('1,2,3,4,5'));
COLUMN_VALUE
--------------------------------------------------------------------------------
1,2,3,4,5

总结:(1)Table函数将数组里的内容通过SQL语句查询出来;
      (2)ODCIVARCHAR2LIST 在9I 及以上版本中均可使用。在9I中可通过创建TYPE,10G及以上直接使用SYS.ODCIVARCHAR2LIST;
      (3)ODCIVARCHAR2LIST 适用于字符集,不适用单个字符串,如果是单个字符串,可以通过参考2中(如下)方法实现。

欢迎大家讨论,提出更多更好的方法~~

参考----------------------------------------------------------------
2.其他方法实现列转行(大牛们早已经总结,仅供参考)
(1) 利用CONNECT BY (使用9I,10G,11G)
WITH T AS (SELECT  '1,2,3,4,5' 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 <= 9) C
       WHERE C.LV <= T.CNT 
       ORDER BY STR1);
(2).正则表达式(使用10G及以上版本)
WITH TEST AS (SELECT  '1,2,3,4,5' AS STR FROM DUAL)
SELECT DISTINCT REGEXP_SUBSTR(STR, '[^,]+', 1, LEVEL)
FROM TEST
CONNECT BY ROWNUM <= 5;

分享到:
评论

相关推荐

    Oracle行列转换

    通过下载提供的`Oracle补充内容_行列转换.sql`文件,你可以看到具体的SQL示例和实际操作,这将帮助你更好地理解和掌握Oracle的行列转换技巧。在实践中,理解并熟练运用这些技术,将有助于你更有效地处理和展示数据,...

    oracle行列转换例子

    在Oracle数据库中,行列转换是一种常见的数据操作需求,主要用于将数据从行的形式转换为列的形式,或者反之。这种转换在数据分析、报表制作等场景中尤为常见。本文将深入解析一个Oracle行列转换的例子,通过详细解释...

    Oracle中实现Split函数功能

    在实际应用中,Oracle 中实现 Split 函数功能可以用于各种数据处理场景,例如数据清洁、数据转换和数据分析等。例如,在数据清洁中,我们可以使用这个函数来拆分字符串,以便更好地处理和分析数据。在数据转换中,...

    oracle行列转换总结

    在Oracle数据库中,行列转换是一项常用且强大的功能,它允许数据在不同的维度上进行转换,以便于数据分析和报告。本文将深入探讨Oracle中实现行列转换的几种方法,包括使用`UNION ALL`、`MODEL`子句以及集合类型(`...

    oracle行列转换

    在Oracle数据库中,进行行列转换是一项常见的数据处理需求,尤其当数据存储格式与最终报告或分析所需的格式不一致时。这种转换技术可以帮助我们将表格中的行数据转换为列数据,反之亦然,从而使得数据能够更好地适应...

    oracle行列转换实例

    【Oracle 行列转换实例】 在数据库管理中,有时我们需要将数据表的行与列进行转换,以便于数据分析和报表展示。Oracle 提供了一种高效的方法,即使用分析函数来实现这种行列转换。分析函数主要设计用于处理累计计算...

    oracle sql 行列转换

    在Oracle SQL中,行列转换是一种常见的数据操作需求,主要用于将数据表中的行转换为列,或将列转换为行,以此来满足不同的数据展示或分析需求。这种转换在处理多维度数据、汇总数据或是进行复杂查询时特别有用。下面...

    oracle split函数

    ### Oracle Split 函数详解 #### 一、Oracle Split 函数简介 在Oracle数据库中,并没有内置的split函数来处理字符串的分割操作。然而,在实际应用中,经常需要将一个包含多个值的字符串按照指定的分隔符进行拆分,...

    oracle_split_函数_返回数组

    在Oracle数据库中,由于内置函数不直接支持像Java中的`split`那样拆分字符串并返回数组,因此开发者需要自定义函数来实现这一功能。这里提到的两种方法都是为了解决这个问题,即根据指定的分隔符将字符串拆分为一个...

    Oracle中SQL语句行列之间相互转换

    在Oracle数据库中,有时我们需要将表格中的行转换为列或将列转换为行,这种操作被称为行列转换。这种转换对于数据分析、报表制作等场景非常有用。本文将详细介绍Oracle中如何进行行列转换,并提供实际的例子。 ####...

    ORACLE 10g 的行列转换(学生科目成绩)测试题

    在Oracle数据库管理中,数据处理有时需要将行数据转换为列数据,或者将列数据转换为行数据,这种操作被称为行列转换。Oracle 10g 提供了多种方法来实现这种转换,包括使用PIVOT和UNPIVOT操作,以及自定义SQL查询等。...

    ORACLE 行列转换

    在Oracle数据库中,行列转换是一种常见的数据操作需求,主要用于改变数据的展示格式,使得数据能够更好地适应特定的分析或报告需求。本文将详细介绍如何在Oracle中实现行转列(即行列转换的一种)以及列转行的操作,...

    oracle数据行列转换

    在Oracle数据库中,数据的行列转换是数据处理过程中的常见操作,尤其在数据分析、报表制作以及数据展示时显得尤为重要。本篇文章将详细讲解Oracle 10g中的行列转换技术,包括如何实现行转列和列转行。 首先,我们要...

    oracle行列转换的例子

    ### Oracle 数据库中的行列转换详解 #### 一、引言 在处理复杂的数据查询与展示时,经常会遇到需要将数据库中的行数据转换成列数据的需求,这种操作通常被称为“行列转换”。例如,当我们想要汇总不同部门对各种...

    Oracle,Split

    ### Oracle Split功能详解 在Oracle数据库管理中,有时我们需要对字符串进行分割处理,这与.NET框架中的`Split`函数有着相似的功能。本文将详细介绍如何在Oracle中实现类似于.NET中的`Split`函数,并通过一个具体的...

    oracle行列转换示例

    oracle行列转换示例,查询转换,有创表过程,数据,清晰明了

    Oracle 行列转换总结

    ### Oracle 行列转换知识点详解 #### 一、概述 在数据库操作中,行列转换是一项非常实用的功能,尤其是在处理报表数据或需要特定格式输出时。本文档将详细讲解Oracle数据库中的行列转换方法,并通过具体实例来说明...

Global site tag (gtag.js) - Google Analytics