Oracle中有字符串分割函数吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle中有字符串分割函数吗相关的知识,希望对你有一定的参考价值。
第一种:oracle字符串分割和提取
分割
create or replace function Get_StrArrayLength
(
av_str varchar2, --要分割的字符串
av_split varchar2 --分隔符号
)
return number
is
lv_str varchar2(1000);
lv_length number;
begin
lv_str:=ltrim(rtrim(av_str));
lv_length:=0;
while instr(lv_str,av_split)<>0 loop
lv_length:=lv_length+1;
lv_str:=substr(lv_str,instr(lv_str,av_split)+length(av_split),length(lv_str));
end loop;
lv_length:=lv_length+1;
return lv_length;
end Get_StrArrayLength;
提取
create or replace function Get_StrArrayStrOfIndex
(
av_str varchar2, --要分割的字符串
av_split varchar2, --分隔符号
av_index number --取第几个元素
)
return varchar2
is
lv_str varchar2(1024);
lv_strOfIndex varchar2(1024);
lv_length number;
begin
lv_str:=ltrim(rtrim(av_str));
lv_str:=concat(lv_str,av_split);
lv_length:=av_index;
if lv_length=0 then
lv_strOfIndex:=substr(lv_str,1,instr(lv_str,av_split)-length(av_split));
else
lv_length:=av_index+1;
lv_strOfIndex:=substr(lv_str,instr(lv_str,av_split,1,av_index)+length(av_split),instr(lv_str,av_split,1,lv_length)-instr(lv_str,av_split,1,av_index)-length(av_split));
end if;
return lv_strOfIndex;
end Get_StrArrayStrOfIndex;
oracle split函数
有别人写好的函数和用法说明
oracle 用逗号分割一个带引号的字符串
【中文标题】oracle 用逗号分割一个带引号的字符串【英文标题】:oracle split by comma a quoted string 【发布时间】:2016-09-16 10:31:22 【问题描述】:我发现了很多这样的问题,但没有一个是 100% 适合我的。我有 oracle 11g express
我有那个字符串
'abcd,123,,defoifcd,"comma, in string",87765,,,hello'
这意味着通常用逗号分隔数据,但可以是空数据(甚至更多),如果数据中有逗号,则引用它。
目前为止最好的 reg exp 就是那个
'("[^"]*"|[^,]+)'
但这会将使用该查询的所有空数据放在末尾p>
with test as
(select
'abcd,123,,defoifcd,"comma, in string", 87765,,,hello'
str from dual
)
select REGEXP_SUBSTR(str, '("[^"]*"|[^,]+)', 1, rownum) split
from test
connect by level <= length (regexp_replace (str, '("[^"]*"|[^,]+)')) + 1;
我也尝试用 ,n/a 替换空数据,所以有
'abcd,123,n/a,defoifcd,"comma, in string",87765,n/a,n/a,hello'
但 regexp_replace 只替换第一次出现的空数据
select
regexp_replace('abcd,123,,defoifcd,"comma, in string",87765,,,hello', '(,,)', ',n/a,')
str from dual;
提前致谢!
【问题讨论】:
this 你已经看过了吗?那是使用 replace 而不是 regexp_replace 将虚拟值放入... 是的,这种替换确实是个好主意 【参考方案1】:这似乎工作并处理 NULL:
SQL> with test as
(select
'abcd,123,,defoifcd,"comma, in string", 87765,,,hello'
str from dual
)
select trim('"' from REGEXP_SUBSTR(str, '(".*?"|.*?)(,|$)', 1, level, NULL, 1)) split
from test
connect by level<=length(regexp_replace(str,'".*?"|[^,]*'))+1;
SPLIT
----------------------------------------------------
abcd
123
defoifcd
comma, in string
87765
hello
9 rows selected.
SQL>
这篇文章为解决方案提供了动力:https://community.oracle.com/thread/528107?tstart=0
【讨论】:
以上是关于Oracle中有字符串分割函数吗的主要内容,如果未能解决你的问题,请参考以下文章