oracle根据特定字符拆分字符串的方法

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

第一种:

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的话这种方法就貌似失灵了,会无限次取,所以问题没解决,有人知道的话麻烦可以告诉我一下。

第二种

 1 create or replace function split(p_list varchar,p_sep varchar := ' ')两个参数,一个实传入字符串名,第二个是根据什么来分割
 2 
 3 return type_split pipelined
 4 
 5 IS
 6 
 7 l_idx pls_integer;
 8 
 9 v_list varchar2(50) := p_list;
10 
11 begin
12 
13  loop
14 
15
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle 中,您可以使用 `SUBSTR`、`INSTR` 和 `REGEXP_SUBSTR` 等函数来根据指定字符拆分字符串。 1. 使用 `SUBSTR` 和 `INSTR` 函数 `SUBSTR` 函数可以返回一个字符串的子串,`INSTR` 函数可以返回一个字符串中指定子串的开始位置。通过不断调用这两个函数,您可以将一个字符串拆分多个子串。 例如,要将字符串 `ABC,DEF,GHI` 按逗号拆分多个子串,您可以使用以下 SQL 代码: ``` WITH data AS ( SELECT 'ABC,DEF,GHI' AS str FROM dual ) SELECT SUBSTR(str, 1, INSTR(str, ',', 1, level) - 1) AS col1, SUBSTR(str, INSTR(str, ',', 1, level) + 1, INSTR(str, ',', 1, level+1) - INSTR(str, ',', 1, level) - 1) AS col2, SUBSTR(str, INSTR(str, ',', 1, level+1) + 1) AS col3 FROM data CONNECT BY level <= LENGTH(str) - LENGTH(REPLACE(str, ',', '')) + 1; ``` 上述 SQL 代码将字符串 `ABC,DEF,GHI` 按逗号拆分成三列,分别为 `ABC`、`DEF` 和 `GHI`。 2. 使用 `REGEXP_SUBSTR` 函数 `REGEXP_SUBSTR` 函数可以根据正则表达式来提取字符串中的子串。通过使用逗号作为分隔符的正则表达式,您可以将一个字符串拆分多个子串。 例如,要将字符串 `ABC,DEF,GHI` 按逗号拆分多个子串,您可以使用以下 SQL 代码: ``` WITH data AS ( SELECT 'ABC,DEF,GHI' AS str FROM dual ) SELECT REGEXP_SUBSTR(str, '[^,]+', 1, 1) AS col1, REGEXP_SUBSTR(str, '[^,]+', 1, 2) AS col2, REGEXP_SUBSTR(str, '[^,]+', 1, 3) AS col3 FROM data; ``` 上述 SQL 代码将字符串 `ABC,DEF,GHI` 按逗号拆分成三列,分别为 `ABC`、`DEF` 和 `GHI`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值