当前位置:首页 > 作文范文 > 作文体裁 > 改写 > 正文
 

split改写select

发布时间:2024-05-01 23:05:34 影响了:

下面是博文学习网小编为你分享的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;

/

相关热词搜索:改写 split select xsplit split用法

相关文章
最新文章

Copyright © 2008 - 2017 版权所有 博文学习网

工业和信息化部 湘ICP备09005888号-2