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中拆分字符串的功能?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装 oracle-xe,CentOS上
- 下一篇: oracle有 哪些常用视图,oracl