请问sql怎样处理这个字符串呢?

表中有一列数据类型为:varchar(100),用来存储10个数字,10个数字之间是使用的英文逗号隔开的

假如值为:10,2,300,10,40,50,60,8,300,25
请问如何使用sql语句将第N个数字(第N个数字是任意的不是固定的,但只会是一个不会是多个)的值取出来,并和加到另外一个int类型的列上呢?

作者: chaoup   发布时间: 2011-06-14

upup

作者: chaoup   发布时间: 2011-06-14

你的"加到另一个int类型上"是什么意思呢,我只会把第N个的值找出来:
SQL code
declare @col varchar(100)
declare @n int
set @col='10,2,300,10,40,50,60,8,300,25'
set @n=6
select n from(
select row_number()over(order by number)rn,n from(
select number,substring(@col,number,charindex(',',@col+',',number+1)-number)n from master..spt_values
where type='p' and number<=len(@col) and substring(@col,number,1)<>',' and substring(','+@col,number,1)=','-- and number=@n+1
)a
)b where rn=@n
/*
n
----------------------------------------------------------------------------------------------------
50

(1 行受影响)

*/

作者: qianjin036a   发布时间: 2011-06-14

SQL code

/* if  exists  (select  *  from  dbo.sysobjects  where  id  =  object_id(N'[dbo].[f_GetStr]')  and  xtype  in  (N'FN',  N'IF',  N'TF'))  
  drop  function  [dbo].[f_GetStr]  
  GO  */
    
  /*--得到字符串列表指定位置的字符*/  
  /*邹建  2004.07(引用请保留此信息)--*/    
  /*--调用示例  
  --测试数据  
  declare  @t  table(FITEM  varchar(100))  
  insert  @t  select  '100..10.'  
  union  all  select  '20.140.10'  
  union  all  select  '150.124.150.10'  
  --查询  
  select  fitem1=dbo.f_GetStr(fitem,1,'.')  
  ,fitem2=dbo.f_GetStr(fitem,2,'.')  
  ,fitem3=dbo.f_GetStr(fitem,3,'.')  
  ,fitem4=dbo.f_GetStr(fitem,4,'.')  
  ,fitem5=dbo.f_GetStr(fitem,5,'.')  
  ,fitem6=dbo.f_GetStr(fitem,6,'.')  
  from  @t  
  --*/  
  
create function [dbo].[f_GetStr]
(
    @s varchar(8000),          
    @pos int,                         
    @split varchar(10)           
)
returns varchar(100)  
as  
begin  
    if @s is null 
        return(null)      
    declare @splitlen int  
    select @splitlen=len(@split+'a')-2
    while @pos>1 and charindex(@split,@s+@split)>0  
        select @pos=@pos-1,@s=stuff(@s,1,charindex(@split,@s+@split)+@splitlen,'')
    return (isnull(left(@s,charindex(@split,@s+@split)-1),'')) 
end  

declare @i varchar(100)
set @i='10,2,300,10,40,50,60,8,300,25'

select dbo.[f_GetStr](@i,4,',')
/*
10
*/


作者: maco_wang   发布时间: 2011-06-14

SQL code
--轉老大
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_GetStr]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_GetStr]
GO
--分段截取函数
CREATE FUNCTION dbo.f_GetStr(
@s varchar(8000),      --包含多个数据项的字符串
@pos int,             --要获取的数据项的位置
@split varchar(10)     --数据分隔符
)RETURNS varchar(100)
AS
BEGIN
    IF @s IS NULL RETURN(NULL)
    DECLARE @splitlen int
    SELECT @splitlen=LEN(@split+'a')-2
    WHILE @pos>1 AND CHARINDEX(@split,@s+@split)>0
        SELECT @pos=@pos-1,
            @s=STUFF(@s,1,CHARINDEX(@split,@s+@split)+@splitlen,'')
    RETURN(ISNULL(LEFT(@s,CHARINDEX(@split,@s+@split)-1),''))
END
GO

select dbo.f_GetStr('2∮11∮10∮09∮10∮13∮786∮91.93∮69∮100.00 ',7,'')
/*
----------------------------------------------------------------------------------------------------
786

(1 個資料列受到影響)

作者: fredrickhu   发布时间: 2011-06-14