欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 运维知识 > 数据库 >内容正文

数据库

oracle sql字符拆分字符串函数,oracle-是否有在PL / SQL中拆分字符串的功能?

发布时间:2025/3/20 数据库 33 豆豆
生活随笔 收集整理的这篇文章主要介绍了 oracle sql字符拆分字符串函数,oracle-是否有在PL / SQL中拆分字符串的功能? 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

oracle-是否有在PL / SQL中拆分字符串的功能?

我需要编写一个过程来规范具有由一个字符连接的多个令牌的记录。 我需要获得这些令牌来分割字符串,并将每个令牌作为新记录插入表中。 Oracle是否具有类似“拆分”功能的功能?

10个解决方案

35 votes

有apex_util.string_to_table-请参阅我对这个问题的回答。

另外,在存在上述功能之前,我曾在自己的博客上发布过一个解决方案。

更新资料

在更高版本的APEX中,不建议使用apex_util.string_to_table,并且首选类似的功能apex_string.split。

Tony Andrews answered 2020-06-18T08:32:54Z

16 votes

你必须自己动手。 例如。,

/* from :http://www.builderau.com.au/architect/database/soa/Create-functions-to-join-and-split-strings-in-Oracle/0,339024547,339129882,00.htm

select split('foo,bar,zoo') from dual;

select * from table(split('foo,bar,zoo'));

pipelined function is SQL only (no PL/SQL !)

*/

create or replace type split_tbl as table of varchar2(32767);

/

show errors

create or replace function split

(

p_list varchar2,

p_del varchar2 := ','

) return split_tbl pipelined

is

l_idx pls_integer;

l_list varchar2(32767) := p_list;

l_value varchar2(32767);

begin

loop

l_idx := instr(l_list,p_del);

if l_idx > 0 then

pipe row(substr(l_list,1,l_idx-1));

l_list := substr(l_list,l_idx+length(p_del));

else

pipe row(l_list);

exit;

end if;

end loop;

return;

end split;

/

show errors;

/* An own implementation. */

create or replace function split2(

list in varchar2,

delimiter in varchar2 default ','

) return split_tbl as

splitted split_tbl := split_tbl();

i pls_integer := 0;

list_ varchar2(32767) := list;

begin

loop

i := instr(list_, delimiter);

if i > 0 then

splitted.extend(1);

splitted(splitted.last) := substr(list_, 1, i - 1);

list_ := substr(list_, i + length(delimiter));

else

splitted.extend(1);

splitted(splitted.last) := list_;

return splitted;

end if;

end loop;

end;

/

show errors

declare

got split_tbl;

procedure print(tbl in split_tbl) as

begin

for i in tbl.first .. tbl.last loop

dbms_output.put_line(i || ' = ' || tbl(i));

end loop;

end;

begin

got := split2('foo,bar,zoo');

print(got);

print(split2('1 2 3 4 5', ' '));

end;

/

RedFilter answered 2020-06-18T08:32:21Z

16 votes

如果APEX_UTIL不可用,则可以使用REGEXP_SUBSTR()解决方案。

灵感来自[http://nuijten.blogspot.fr/2009/07/splitting-comma-delimited-string-regexp.html]:

DECLARE

I INTEGER;

TYPE T_ARRAY_OF_VARCHAR IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;

MY_ARRAY T_ARRAY_OF_VARCHAR;

MY_STRING VARCHAR2(2000) := '123,456,abc,def';

BEGIN

FOR CURRENT_ROW IN (

with test as

(select MY_STRING from dual)

select regexp_substr(MY_STRING, '[^,]+', 1, rownum) SPLIT

from test

connect by level <= length (regexp_replace(MY_STRING, '[^,]+')) + 1)

LOOP

DBMS_OUTPUT.PUT_LINE(CURRENT_ROW.SPLIT);

MY_ARRAY(MY_ARRAY.COUNT) := CURRENT_ROW.SPLIT;

END LOOP;

END;

/

Frosty Z answered 2020-06-18T08:33:18Z

10 votes

这仅适用于Oracle 10G及更高版本。

基本上,您使用regex_substr对字符串进行拆分。

[HTTPS://blogs.Oracle.com/阿日阿嬤嬷哦/entry/how_to_split_comma_separated_string_安定_pass_to_in_clause_of_select_statement]

Meower68 answered 2020-06-18T08:33:47Z

5 votes

您可以按以下方式使用SUBSTR和INSTR的组合:

字符串示例:field = 'DE124028#@$1048708#@$000#@$536967136#@$'

分隔符为#@ $。

例如,要获取“ 1048708”:

如果字段的长度固定(此处为7):

substr(field,instr(field,'#@$',1,1)+3,7)

如果字段长度可变:

substr(field,instr(field,'#@$',1,1)+3,instr(field,'#@$',1,2) - (instr(field,'#@$',1,1)+3))

您可能应该研究SUBSTR和INSTR函数以获得更大的灵活性。

Mo Chahal answered 2020-06-18T08:34:33Z

5 votes

请在下一个示例中找到有用的示例

-第一子串

select substr('alfa#bravo#charlie#delta', 1,

instr('alfa#bravo#charlie#delta', '#', 1, 1)-1) from dual;

-第二子串

select substr('alfa#bravo#charlie#delta', instr('alfa#bravo#charlie#delta', '#', 1, 1)+1,

instr('alfa#bravo#charlie#delta', '#', 1, 2) - instr('alfa#bravo#charlie#delta', '#', 1, 1) -1) from dual;

-第三子串

select substr('alfa#bravo#charlie#delta', instr('alfa#bravo#charlie#delta', '#', 1, 2)+1,

instr('alfa#bravo#charlie#delta', '#', 1, 3) - instr('alfa#bravo#charlie#delta', '#', 1, 2) -1) from dual;

第四子串

select substr('alfa#bravo#charlie#delta', instr('alfa#bravo#charlie#delta', '#', 1, 3)+1) from dual;

最好的祝福

埃马努埃莱

Emanuele answered 2020-06-18T08:35:19Z

5 votes

您可以使用regexp_substr()。 例:

create or replace type splitTable_Type is table of varchar2(100);

declare

l_split_table splitTable_Type;

begin

select

regexp_substr('SMITH,ALLEN,WARD,JONES','[^,]+', 1, level)

bulk collect into

l_split_table

from dual

connect by

regexp_substr('SMITH,ALLEN,WARD,JONES', '[^,]+', 1, level) is not null;

end;

该查询遍历逗号分隔的字符串,搜索逗号(,),然后通过将逗号视为定界符来分割字符串。 每当遇到定界符时,它就将字符串作为一行返回。

语句regexp_substr('SMITH,ALLEN,WARD,JONES','[^,]+', 1, level)中的level引用了Oracle中的一个伪列,该伪列用于层次结构查询中以数字格式标识层次结构级别:

ferralucho answered 2020-06-18T08:35:48Z

1 votes

function numinstr(p_source in varchar2,p_token in varchar2)

return pls_integer

is

v_occurrence pls_integer := 1;

v_start pls_integer := 1;

v_loc pls_integer;

begin

v_loc:=instr(p_source, p_token, 1, 1);

while v_loc > 0 loop

v_occurrence := v_occurrence+1;

v_start:=v_loc+1;

v_loc:=instr(p_source, p_token, v_start, 1);

end loop;

return v_occurrence-1;

end numinstr;

--

--

--

--

function get_split_field(p_source in varchar2,p_delim in varchar2,nth pls_integer)

return varchar2

is

v_num_delims pls_integer;

first_pos pls_integer;

final_pos pls_integer;

len_delim pls_integer := length(p_delim);

ret_len pls_integer;

begin

v_num_delims := numinstr(p_source,p_delim);

if nth < 1 or nth > v_num_delims+1 then

return null;

else

if nth = 1 then

first_pos := 1;

else

first_pos := instr(p_source, p_delim, 1, nth-1) + len_delim;

end if;

if nth > v_num_delims then

final_pos := length(p_source);

else

final_pos := instr(p_source, p_delim, 1, nth) - 1;

end if;

ret_len := (final_pos - first_pos) + 1;

return substr(p_source, first_pos, ret_len);

end if;

end get_split_field;

Carl answered 2020-06-18T08:36:04Z

-1 votes

我喜欢该apex实用程序的外观。 但是,对于可以用于此目的的标准oracle函数也很了解:subStr和inStr[http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions001.htm]

Emu answered 2020-06-18T08:36:24Z

-1 votes

乡亲有一种简单的方法。 使用REPLACE功能。 这是一个用逗号分隔的字符串的示例,可以将其传递给IN子句。

在PL / SQL中:

StatusString := REPLACE('Active,Completed', ',', ''',''');

在SQL Plus中:

Select REPLACE('Active,Completed', ',', ''',''') from dual;

Kishor answered 2020-06-18T08:36:52Z

总结

以上是生活随笔为你收集整理的oracle sql字符拆分字符串函数,oracle-是否有在PL / SQL中拆分字符串的功能?的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。