split改写select
下面是博文学习网小编为你分享的split改写select,希望能够为大家带来帮助,希望大家会喜欢。同时也希望给你们带来一些参考的作用,如果喜欢就请继续关注我们博文学习网(www.hnnscy.com)的后续更新吧!
split改写select篇一:SQL以逗号隔开的字段转化为列
--创建用户定义函数
create function func_splitstring
--字符串参数
--逗号参数
(@str nvarchar(max),
@split varchar(10))
--把表值函数的返回值赋值一个变量
函数返回一个表
returns @t Table (c1 varchar(100))
as
begin
declare @i int
declare @s int
set @i=1
set @s=1
while(@i>0)
begin
set @i=charindex(@split,@str,@s)
if(@i>0)
begin
insert @t(c1) values(substring(@str,@s,@i-@s))
end
else begin
insert @t(c1) values(substring(@str,@s,len(@str)-@s+1)) end
set @s=@i+1
end
return
end
--函数用户定义函数直接调用
select * from dbo.func_splitstring((select InvoiceTypeName InvoiceTypeID=1),',') from Invoice where
split改写select篇二:SQL 根据字符分割字符串的三种写法
go
--创建函数(第一版)
create function [dbo].[m_split](@c varchar(2000),@split varchar(2)) returns @t table(col varchar(200))
as
begin
while(charindex(@split,@c)<>0)
begin
insert @t(col) values (substring(@c,1,charindex(@split,@c)-
1))
set @c = stuff(@c,1,charindex(@split,@c),'')
end
insert @t(col) values (@c)
return
end
--下面两种是在论坛看到高手们发的
go
--创建函数(第二版)(fredrickhu(小F))
create function [dbo].[f_split](@s varchar(8000), @split varchar(10) )
returns table
as
return
(select substring(@s,number,charindex(@split,@s+@split,number)-number)as col
from master..spt_values
where type='p' and number<=len(@s+'a')
and charindex(@split,@split+@s,number)=number)
go
--创建函数(第三版)(dawugui(爱新觉罗.毓华))
create function [dbo].[d_split] (@inputstr varchar(8000),@seprator varchar(10))
returns @temp table (a varchar(200))
as
begin
declare @i int
set @inputstr = rtrim(ltrim(@inputstr))
set @i = charindex(@seprator, @inputstr)
while @i >= 1
begin
insert @temp values(left(@inputstr, @i - 1))
set @inputstr = substring(@inputstr, @i + 1, len(@inputstr) - @i) set @i = charindex(@seprator, @inputstr)
end
if @inputstr <> '/'
insert @temp values(@inputstr)
return
end
--测试示例
declare @sql varchar(20)
set @sql='A,B,C,D,E'
select * from dbo.m_split(@sql,',')
select * from dbo.f_split(@sql,',')
select * from dbo.d_split(@sql,',')
--运行结果(结果是相同的)
/*
col
---------
A
B
C
D
E
*/
split改写select篇三:oracle split 函数 返回数组
oracle split 函数 返回数组
最近在oracle 中用到拆分字符串返回数组,一直头痛,因为在 oracle 中没有类似java中有split 函数 ,所以要自己写。好不容搜到一个。那网上是到处都是这个代码。怎么找都是这个方法,我就用了。这个方法如下: (方法一)用到后面出现 了bug 。哎弄了一下午就给别人测试了一下bug。(方法一)根本就行不通。于是我就自己改写了。(方法二)大家如有需要的请参考方法二:
如果用方法一来分隔字符串。
比如 我需要分隔的字符串为”a,b,c,d/e,f,g,h/i,j,k,l”
分隔符为"/" ,分割后的数组,只有两组,最后一组消失了!
如果 我需要分隔的字符串为”a,b,c,d”
分隔符为"/",分隔后的数组,就没有问题。
方法一(相信大家在网上已经搜到不少了,也看到不少了。)
(方法一)
CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000);
CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)RETURN ty_str_split
IS
j INT := 0;
i INT := 1;
len INT := 0;
len1 INT := 0;
str VARCHAR2 (4000);
str_split ty_str_split := ty_str_split ();
BEGIN
len := LENGTH (p_str);
len1 := LENGTH (p_delimiter);
WHILE j < len
LOOP
j := INSTR (p_str, p_delimiter, i);
IF j = 0
THEN
j(转 载于:www.hnNscy.CoM 博文学习网:split改写select) := len;
str := SUBSTR (p_str, i);
str_split.EXTEND;
str_split (str_split.COUNT) := str;
IF i >= len
THEN
EXIT;
END IF;
ELSE
str := SUBSTR (p_str, i, j - i);
i := j + len1;
str_split.EXTEND;
str_split (str_split.COUNT) := str;
END IF;
END LOOP;
RETURN str_split;
END fn_split;
/
测试:
DECLARE
CURSOR c
IS
SELECT *
FROM TABLE (CAST (fn_split ('1;;12;;123;;1234;;12345', ';;') AS ty_str_split
)
);
r c%ROWTYPE;
BEGIN
OPEN c;
LOOP
FETCH c INTO r;
EXIT WHEN c%NOTFOUND;
DBMS_OUTPUT.put_line (r.column_value);
END LOOP;
CLOSE c;
END;
/
结果:
1
12
123
1234
12345
方法二
第一:先在TYPE 里面建一个table
注意 TABLE OF VARCHAR2(200);取决于你的字符串的长度。
CREATE OR REPLACE TYPE LW.T_VARRAY
IS
TABLE OF VARCHAR2(200);
/
第二:在FUNCTION里面开始写方法
两个参数 P_LIST 为传进去需要拆分的字符串
P_SEP 为选择根据什么字符来分隔
CREATE OR REPLACE FUNCTION LW.STR_SPLIT(P_LIST IN VARCHAR2,P_SEP IN VARCHAR2) RETURN T_VARRAY
IS
L_IDX PLS_INTEGER;
V_LIST VARCHAR2(250) := P_LIST;
RES VARCHAR2(250);
J NUMBER(4):=1;
CSTR T_VARRAY := T_VARRAY(); --声明集合
BEGIN
LOOP
L_IDX := INSTR(V_LIST, P_SEP);
IF L_IDX > 0 THEN
RES := SUBSTR(V_LIST, 1, L_IDX - 1);
CSTR.EXTEND(1);
CSTR(J) := RES;
V_LIST := SUBSTR(V_LIST, L_IDX + LENGTH(P_SEP));
ELSE
RES := V_LIST;
CSTR.EXTEND(1);
CSTR(J) := RES;
EXIT;
END IF;
J :=J+1;
END LOOP;
RETURN CSTR;
END STR_SPLIT;
/