清洗数据需要将某个字段内以空格分隔的字符串拆分成多行单个的字符串,百度了很多种方法大概归结起来也就这几种方法最为有效,现在把贴出来:

第一种:

select regexp_substr('1 2 3','[^ ]+',1,level,'i') from dual

connect by level <= length('1 2 3') -length(regexp_replace('1 2 3',' ',''))+1;

效果就是这个样子↓

效果

这种方法的核心就是regexp_substr函数,通过正则来拆分字符串,函数用法为:

regexp_substr(str,进行匹配的正则表达式,position,标志第几个匹配组,modifier)

该函数的一个缺点就是只能每次取一个字符串出来,这个就比较头痛了,因为现在我要取分割后所有的字符串,所以现在就要用到connect by命令,来限制取几个匹配组,当然我们是要全部的,所以就通过length来实时确定所取得匹配组数量。

通过这种方法就可以实现开题的需求,但在用的过程中发现一个问题,如果说我要给拆分后的字符串带上ID的话这种方法就貌似失灵了,会无限次取,所以问题没解决,有人知道的话麻烦可以告诉我一下。

第二种

 create or replace function split(p_list varchar,p_sep varchar := ' ')两个参数,一个实传入字符串名,第二个是根据什么来分割

 return type_split pipelined

 IS

 l_idx pls_integer;

 v_list varchar2(50) := p_list;

 begin

  loop

    l_idx :=instr(v_list,p_sep);

    if l_idx = 0then

      piperow(substr(v_list,1,l_idx-1));

      v_list :=substr(v_list,l_idx+length(p_sep));

    else

      piperow(v_list);

     exit;

    end if;

   end loop;

 end split;

通过创建函数的方法实现拆分字符串,缺点同一,无法实现取ID

用法:

selelct * from table(split(这里写字符串,’ ’));

与第二种异曲同工的还有接下来这一种

第二种.2

 CREATE OR REPLACE
FUNCTION splitstr (str IN CLOB,
i IN NUMBER := 0,
sep IN VARCHAR2 := ','
)
RETURN VARCHAR2
/**************************************
52 * Name: splitstr
53 * Author: Sean Zhang.
54 * Date: 2012-09-03.
55 * Function: 返回字符串被指定字符分割后的指定节点字符串。
56 * Parameters: str: 待分割的字符串。
57 i: 返回第几个节点。当i为0返回str中的所有字符,当i 超过可被分割的个数时返回空。
58 sep: 分隔符,默认逗号,也可以指定字符或字符串。当指定的分隔符不存在于str中时返回sep中的字符。
59 * Example: select splitstr('abc,def', 1) as str from dual; 得到 abc
60 select splitstr('abc,def', 3) as str from dual; 得到 空
61 **************************************/
IS
t_i NUMBER;
t_count NUMBER;
t_str VARCHAR2 (4000);
BEGIN
IF i = 0
THEN
t_str := str;
ELSIF INSTR (str, sep) = 0
THEN
t_str := sep;
ELSE
SELECT COUNT ( * )
INTO t_count
FROM table (split (str, sep));
IF i <= t_count
THEN
SELECT str
INTO t_str
FROM (SELECT ROWNUM AS item, COLUMN_VALUE AS str
FROM table (split (str, sep)))
WHERE item = i;
END IF;
END IF; RETURN t_str;
END;

第三种:

个人认为第三种才是最有效果的用了with as命令,以下优点解释摘自网络

With查询语句不是以select开始的,而是以“WITH”关键字开头    可认为在真正进行查询之前预先构造了一个临时表TT,之后便可多次使用它做进一步的分析和处理

WITHClause方法的优点:增加了SQL的易读性,如果构造了多个子查询,结构会更清晰;更重要的是:“一次分析,多次使用”,这也是为什么会提供性能的地方,达到了“少读”的目标。

第一种使用子查询的方法表被扫描了两次,而使用WITH Clause方法,表仅被扫描一次。这样可以大大的提高数据分析和查询的效率。

另外,观察WITH Clause方法执行计划,其中“SYS_TEMP_XXXX”便是在运行过程中构造的中间统计结果临时表。

 with temp0 as (select LEVEL lv from dualCONNECT BY LEVEL <= 100)  

 select id,

 substr(t.vals,instr(t.vals, ' ', 1, tv.lv)+ 1,instr(t.vals, ' ', 1, tv.lv + 1)-(instr(t.vals, ' ', 1, tv.lv) + 1)) ASattr4  

 from 

 (select id,' ' || attr4 || ' ' ASvals,length(attr4 || ' ') - nvl(length(REPLACE(attr4, ' ')), 0) AS cnt

  fromT_FLIGHT_TLX_TOTAL where rownum < 3) t 

 join temp0 tv  on  tv.lv <= t.cnt  order by 1;

oracle根据特定字符拆分字符串的方法的更多相关文章

  1. 如果是除去末尾特定字符或字符串:TrimEnd方法性能优于Remove方法

    测试用例--除去末尾特定字符或字符串,Remove方法和TrimEnd方法的比较 结论: 如果是除去末尾特定字符或字符串:TrimEnd方法性能优于Remove方法 具体测试用例如下: Stopwat ...

  2. 在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)

    原文:在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ...

  3. 【转载】C#中PadLeft函数按特定字符补足字符串长度

    在C#开发过程中字符串String类处理过程中,有时字符串长度不够时,需要在左侧指定特定的字符来补足字符串长度,此时可以使用String类下的PadLeft方法对字符串的左边进行按特定的字符和特定的长 ...

  4. 【转载】 C#中PadRight函数以特定字符在字符串结尾补足位数

    在C#开发过程中字符串String类处理过程中,有时字符串长度不够时,需要在右侧侧指定特定的字符来补足字符串长度,此时可以使用String类下的PadRight方法对字符串结尾按特定的字符补足位数.M ...

  5. oracle查找某个字符在字符串中的个数的技巧

    Oracle没有提供查找某个字符在字符串中出现次数的函数,当遇到这样的需求的时候,我们只能使用另外的方法去实现. 简单的思路就是,假设有个字符串str,然后里面有n个[a]字符,当把这n个[a]字符去 ...

  6. Sql Server中使用特定字符分割字符串

    在T-SQL中我们经常批量操作时都会对字符串进行拆分,可是SQL Server中却没有自带Split函数,所以要自己来实现了.这里将字符串分割以table形式输出 语法如下: SET ANSI_NUL ...

  7. javascript 特定字符分隔字符串函数

    function fn(num,div,token){//num需要分割的数字,div多少位分割 token分割字符 num=num+'',div=div||3,token=token||',' re ...

  8. SQL 根据指定字符拆分字符串

    CREATE FUNCTION [dbo].[F_StringSplit] ( @STR NVARCHAR(MAX)='', )='') )) AS BEGIN DECLARE @NUM INT, @ ...

  9. Oracle以固定字符截取字符串

    CREATE OR REPLACE FUNCTION "F_SPLIT" (p_str IN CLOB, p_delimiter IN VARCHAR2) RETURN ty_st ...

随机推荐

  1. Springmvc多视图

    Springmvc多视图 多视图是一个方法可以返回json/xml等格式的数据 第一步:导入xml格式支持的jar包 spring-oxm-3.2.0.RC2.jar 第二步:配置支持多视图 < ...

  2. 吴裕雄--天生自然python学习笔记:python用 Selenium 组件实现浏览器操作自动化

    一般情况下,我们都是用手工操作的方式来对浏览器进行各种操作 . 实际上, 只要我们安装一个自动化操作组件, Python 就可以让我们的很多操作实现自动化 . Selenium 组件 在开发网页时,用 ...

  3. relieved|auction|calculate|campaign|charge for |chartered

    ADJ-GRADED 感到宽慰的;感到安心的;宽心的If you are relieved, you feel happy because something unpleasant has not h ...

  4. 遍历一个文件夹,打印出该文件夹下所有的py文件

    import os def iterbrowse(path): for home, dirs, files in os.walk(path): for filename in files: yield ...

  5. linux下的时区修改

    Centos 7时区问题: 通常使用tzselect命令选择时区,今天在修改centos7的时区的时候,修改完以后时区还是没有发生变化,重启也是没有用的:通过网络的帮助了解到,在Centos和ubun ...

  6. OpenSSL之X509系列

    OpenSSL之X509系列之1---引言和X509概述 [引言]    X509是系列的函数在我们开发与PKI相关的应用的时候我们都会用到,但是OpenSSL中对X509的描述并不是很多,鉴于些,我 ...

  7. keepalive笔记之二:keepalive+nginx(自定义脚本实现,上述例子也可以实现)

    keepalive的配置文件 ! Configuration File for keepalived global_defs { notification_email { acassen@firewa ...

  8. 吴裕雄--天生自然 R语言开发学习:聚类分析

    #-------------------------------------------------------# # R in Action (2nd ed): Chapter 16 # # Clu ...

  9. 使用JDBC CallableStatements执行存储过程

    Using JDBC CallableStatements to Execute Stored Procedures Connector / J完全实现了 java.sql.CallableState ...

  10. 算法笔记-Day_01(1001 害死人不偿命的(3n+1)猜想

    卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 (3n+1) 砍掉一半.这样一直反复砍下去,最后一定在某一步得到 n=1.卡拉兹在 1950 ...