`
yhq1212
  • 浏览: 82013 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

oralce 逗号分割变多行

 
阅读更多

方法一
select  a.*  ,
REGEXP_SUBSTR(a.rolecode ,'[^,]+',1,l) AS rolecode
from p_user a,(SELECT LEVEL l FROM DUAL CONNECT BY LEVEL<=100) b
WHERE l <=LENGTH(a.rolecode) - LENGTH(REPLACE(rolecode,','))+1

 

 

 

使用函数REGEXP_SUBSTR拆分字符串:

5个参数

第一个是输入的字符串

第二个是正则表达式

第三个是标识从第几个字符开始正则表达式匹配。(默认为1)

第四个是标识第几个匹配组。(默认为1)

第五个是是取值范围:

i:大小写不敏感;

c:大小写敏感;

n:点号 . 不匹配换行符号;

m:多行模式;

x:扩展模式,忽略正则表达式中的空白字符。

SELECT a.*,REGEXP_SUBSTR(servicereqid ,'[^;]+',1,l) AS servicereq
  FROM sum_portal_satisfaction a,(SELECT LEVEL l FROM DUAL CONNECT BY LEVEL<=100) b
WHERE l <=LENGTH(servicereqid) - LENGTH(REPLACE(servicereqid,';'))+1
ORDER BY 1,2;

----SELECT LEVEL l FROM DUAL CONNECT BY LEVEL<=100; 生成1到100的数据行。
----l <=LENGTH(servicereqid) - LENGTH(REPLACE(servicereqid,';'))+1,注意此处是‘L’并非‘1’,上面的REGEXP_SUBSTR的第四个参数也一样。


---下面为拆分字符串,再进行的行转列
create or replace view v_sum_portal_satisfaction_sr as
select
survey_type,
survey_time,
center_code,
center_name,
city_id,
city_name,
REGEXP_SUBSTR(servicereqid ,'[^;]+',1,l) AS servicereqid,
REGEXP_SUBSTR(servicereqname ,'[^;]+',1,l) AS servicereqname,
sum(decode(survey_value,0, sur_times,null)) giveup_times,--调查值 -1:未处理 0:用户放弃 1:很满意 2.满意 3.对csr不满意 4.对其它不满意
sum(decode(survey_value,1, sur_times,null))vsatis_times,
sum(decode(survey_value,2, sur_times,null))satis_times,
sum(decode(survey_value,3, sur_times,null))ncsr_times,
sum(decode(survey_value,4, sur_times,null))nelse_times,
sum(sur_times) sur_times
  FROM sum_portal_satisfaction a,(SELECT LEVEL l FROM DUAL CONNECT BY LEVEL<=100) b
WHERE l <=LENGTH(servicereqid) - LENGTH(REPLACE(servicereqid,';'))+1
group by
subslevelid,
center_code,
center_name,
city_id,
city_name,
survey_type,
survey_time,
servicereqid,
servicereqname,l

 

 

 

 

 

方法二:

 
create table  testTable (
       id  nvarchar2(200) primary key not null ,
       content  nvarchar2(200) not null
)

insert into  testTable values ('4','馆内idx_10馆外idx_11总体idx_12');


select *  from table ( CAST (fn_split(('馆内idx_1$馆外idx_2$总体idx_3$') ,'$') as ty_str_split  )  )

 
 
 
  



select * from testtable b left join  table (fn_split((content), '$')   ) a   on 1=1;

--实现split函数
CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000);

CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)
    RETURN ty_str_split
IS
    j INT := 0;
    i INT := 1;
    len INT := 0;
    len1 INT := 0;
    str VARCHAR2 (4000);
    str_split ty_str_split := ty_str_split ();
BEGIN
    len := LENGTH (p_str);
    len1 := LENGTH (p_delimiter);

    WHILE j < len
    LOOP
        j := INSTR (p_str, p_delimiter, i);

        IF j = 0
        THEN
            j := len;
            str := SUBSTR (p_str, i);
            str_split.EXTEND;
            str_split (str_split.COUNT) := str;

            IF i >= len
            THEN
                EXIT;
            END IF;
        ELSE
            str := SUBSTR (p_str, i, j - i);
            i := j + len1;
            str_split.EXTEND;
            str_split (str_split.COUNT) := str;
        END IF;
    END LOOP;

    RETURN str_split;
END fn_split;




DECLARE
    CURSOR c
    IS
select *  from table ( CAST (fn_split(('馆内idx_1$馆外idx_2$总体idx_3$') ,'$') as ty_str_split  )  );

    r c%ROWTYPE;
BEGIN
    OPEN c;

    LOOP
        FETCH c INTO r;
        EXIT WHEN c%NOTFOUND;
        DBMS_OUTPUT.put_line (r.column_value);
    END LOOP;

    CLOSE c;
END;

 

 

 

 

 

分享到:
评论

相关推荐

    oracle sql 某列的值按照逗号分割显示成多行.sql

    oracle 某列存儲的值是有逗號的字符串,希望通過逗號分隔開來顯示多行。sql,有預期結果,有項目實戰。

    oracle将以逗号分隔字符串转多行

    在Oracle数据库中,将逗号分隔的字符串转换为多行是常见的数据处理需求,尤其在需要对每个分隔项进行单独操作时。这个过程通常涉及到字符串处理函数,如`REGEXP_SUBSTR`和`REPLACE`,以及层次查询结构`CONNECT BY`。...

    Oracle 分割字符串 返回多行数据

    Oracle 分割字符串 返回多行数据

    SQL 语句 将一个表中用特殊字符分割的字段转换成多行数据.docx

    SQL 字符串分割函数实现多行数据转换 在数据库中,经常会遇到将一个字段中的特殊字符分割的字符串转换成多行数据的情况。这是一个常见的需求,但是网上提供的解决方案往往非常复杂,难以理解和实现。为了解决这个...

    Oracle字段根据逗号分割查询数据的方法

    总结来说,Oracle字段根据逗号分割查询数据的方法利用了正则表达式和层次查询,提供了灵活且精确的解决方案。通过理解这些技术,我们可以有效地处理存储在单个字段中的分隔值查询。同时,也应关注其潜在的性能影响,...

    oracle wm_concat 列转行 逗号分隔

    Oracle中的WM_CONCAT函数是一个非标准的聚合函数,主要用于将多行数据合并成单行,以逗号分隔的形式返回。这个函数在处理特定的数据汇总和报告需求时非常有用,尤其是在你需要将某个列的多个值合并成一个字符串时。...

    详解oracle管道函数的用法(一行拆为多行)

    这个函数`split`接收两个参数:`p_string`是要分割的字符串,`p_sep`是分割字符串的分隔符,默认值为逗号。在函数内部,使用`INSTR`函数找到分隔符的位置,并使用`SUBSTR`函数提取子字符串。`PIPE ROW`语句将提取的...

    Oracle+发送邮件存储过程

    可以指定多个附件,附件名之间用逗号或分号分隔。 11. **P_ENCODE**: 附件编码格式,'bit7'表示文本类型附件,'base64'表示二进制类型附件。需要注意的是,文本类型的附件不能使用base64格式发送,且多个附件需使用...

    oracle统计时间段内每一天的数据(推荐)

    总结起来,Oracle提供了一系列强大的函数和操作,使得在SQL中处理日期和时间变得非常灵活。通过巧妙地组合这些工具,我们可以轻松地完成统计时间段内每一天的数据的任务。在进行此类操作时,确保理解这些函数的用法...

    oracle 字符串转成行

    在Oracle数据库中,将一个以逗号分隔的字符串转换为多行是一项常见的需求,特别是在处理数据分隔或者批量操作时。这个问题可以通过SQL查询来解决,利用字符串函数和层次查询来实现。以下是对标题和描述中提到的知识...

    Oracle P/L SQL实现发送Email、浏览网页等网络操作功能

    as_AttachLists in VarChar2 Default Null, --多个用逗号,分开 as_SMTPHost in VarChar2, --邮件服务器 ai_SMTPPort in PLS_Integer Default 25, --邮件服务器端口 as_SMTPAuth in VarChar2 ...

    Oracle 存储过程发送邮件实例学习

    5. **多行正文**:邮件正文可以包含多行文本。 6. **多附件**:可以通过逗号或分号分隔多个附件文件名来实现。 7. **文本和二进制附件**:通过指定编码格式(P_ENCODE),可以发送文本和二进制类型的附件。 8. **...

    编程规范思想

    - 避免写超长的PL/SQL代码:过长的代码不利于阅读和维护,应当分割或重构。 此外,文档中强调了使用统一的代码格式化工具(beautifier),以确保所有开发人员的代码风格一致。Oracle保留字和关键字请参考视图V$...

    关系数据库语言SQL知识介绍.pptx

    - **一行或多行**:一条语句可以跨越多行书写,但关键字必须保持完整,不可分割。 - **逗号分隔**:在列出多个数据项时,用逗号作为分隔符。 - **单引号定界**:字符和字符串常量需要用单引号括起。 在数据库中,有...

    sql高级进阶

    - 根据表中的行创建一个分隔列表:将行数据合并为一个逗号分隔的字符串。 - 提取第n个分隔的子串:使用数据库的字符串分割函数。 - 分解IP地址:将IP地址字符串拆分成单独的数字。 - 将分隔数据转换为多值IN列表...

    PL-SQL用户指南与参考(译)

    PL/SQL使用特定的符号作为分隔符,如逗号用于分割列表中的项目。 **2、标识符** 标识符用于命名变量、常量、过程等,遵循一定的命名规则。 **3、文字** 文字用于表示固定的值,包括字符串、数字等。 **4、注释*...

    SAS_Programming_Skills

    - **命令可以跨多行**:只要单词不被分割,命令可以跨越多行书写。 - **一行内可以包含多个命令**:为了提高代码的紧凑性和可读性,可以在一行内编写多个命令。 #### 二、SAS程序的基本组成部分 SAS程序主要由两个...

Global site tag (gtag.js) - Google Analytics