Oracle 创建 split 和 splitstr 函数
Sql語句最好依次執行創建
/**************************************
?* name:? ? ? ? split
?* author:? ? ? sean zhang.
?* date:? ? ? ? 2012-09-03.
?* function:? ? 返回字符串被指定字符分割后的表類型。
?* parameters:? p_list: 待分割的字符串。
? ? ? ? ? ? ? ? p_sep: 分隔符,默認逗號,也可以指定字符或字符串。
?* example:? ? select * from users where u_id in (select column_value from table (split ('1,2')))
? ? ? ? ? ? ? ? 返回u_id為1和2的兩行數據。
?**************************************/
/* 創建一個表類型 */
create or replace type tabletype as table of varchar2(32676)
/* 創建 split 函數 */
create or replace function split (p_list clob, p_sep varchar2 := ',')
? return tabletype
? pipelined
is
? l_idx? ? pls_integer;
? v_list? varchar2 (32676) := p_list;
begin
? loop
? ? ? l_idx? := instr (v_list, p_sep);
? ? ? if l_idx > 0
? ? ? then
? ? ? ? pipe row (substr (v_list, 1, l_idx - 1));
? ? ? ? v_list? := substr (v_list, l_idx + length (p_sep));
? ? ? else
? ? ? ? pipe row (v_list);
? ? ? ? exit;
? ? ? end if;
? end loop;
end;
/**************************************
?* name:? ? ? ? splitstr
?* author:? ? ? sean zhang.
?* date:? ? ? ? 2012-09-03.
?* function:? ? 返回字符串被指定字符分割后的指定節點字符串。
?* parameters:? str: 待分割的字符串。
? ? ? ? ? ? ? ? i: 返回第幾個節點。當i為0返回str中的所有字符,當i 超過可被分割的個數時返回空。
? ? ? ? ? ? ? ? sep: 分隔符,默認逗號,也可以指定字符或字符串。當指定的分隔符不存在于str中時返回sep中的字符。
?* example:? ? select splitstr('abc,def', 1) as str from dual;? 得到 abc
? ? ? ? ? ? ? ? select splitstr('abc,def', 3) as str from dual;? 得到 空
?**************************************/
/* 創建 splitstr 函數 */
create or replace function splitstr(str in clob,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? i? in number := 0,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sep in varchar2 := ',') return varchar2 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;
示例:split(字符串,標識)
select ?split('a,b,c,e,d,f,g') ?arrData ?from ?dual;
默認使用逗號分割,可以自定義修改,如:select split('X-rapido & Lemon','&') arrData from dual;
點開集合
默認使用逗號分割,可以自定義修改,如:select split('X-rapido & Lemon','&') arrData from dual;
示例:splitstr(字符串,獲取的節點下標,分隔符)
select splitstr('X-rapido&Lemon&Jennifer', 1, '&') word from dual; ?-- X-rapido
select splitstr('X-rapido&Lemon&Jennifer', 2, '&') word from dual; ?-- Lemon
select splitstr('X-rapido&Lemon&Jennifer', 3, '&') word from dual; ?-- Jennifer
select splitstr('X-rapido&Lemon&Jennifer', 4, '&') word from dual;??-- 空字符串
總結
以上是生活随笔為你收集整理的Oracle 创建 split 和 splitstr 函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows mysql提示:1045
- 下一篇: 国家金库的资金取之于民,用之于民