高分求 格式字符串提取数值

wanabe 2012-11-08 09:44:32
数据库一字段类型为 char(255) 用#号分隔的字符串 有什么方法将数字取出来
如字符串
1#23#0.98#9527 则提取出 1 23 0.98 9527
88#2#1#0 则提取出 88 2 1 0
方便累加

最终得出 99#25#1.98#9527的字符串

分不够 可以+ 欢迎大家提出宝贵意见
...全文
351 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
-晴天 2012-11-09
  • 打赏
  • 举报
回复
declare @s varchar(100)
create table tb(a float,b float,c float,d float)

set @s='1#23#0.98#9527'
set @s='insert into tb select '+replace(@s,'#',',')
execute (@s)
set @s='88#2#1#0'
set @s='insert into tb select '+replace(@s,'#',',')
execute (@s)
select convert(varchar,sum(a))+'#'+convert(varchar,sum(b))+'#'+convert(varchar,sum(c))+'#'+convert(varchar,sum(d)) from tb
/*
89#25#1.98#9527

(1 行受影响)

*/
go
drop table tb
gengjuncai 2012-11-09
  • 打赏
  • 举报
回复
用substing, charindex 组合以“#”为分隔符就可以了。。。
wanabe 2012-11-09
  • 打赏
  • 举报
回复
谢谢 各位 晚上结贴 还有其他方法 欢迎来搞 有分
快溜 2012-11-09
  • 打赏
  • 举报
回复
substring分隔字符串,再相加。
极品老土豆 2012-11-09
  • 打赏
  • 举报
回复

--声明变量
declare @x varchar(1000)
declare @y varchar(1000)
declare @x1 int
declare @y1 int
declare @z varchar(1000)
set @z = ' '
--赋值变量
set @x = '1#23#0.98#9527'
set @y = '88#2#1#0'
set @x = @x+'#'
set @y = @y+'#'
--计算测试
while(len(@x)<>0 and len(@y)<>0)
 begin

   set @x1 = charindex('#',@x)-1
   set @y1 =charindex('#',@y)-1
   if(@x1<=0)
     set @x1 = len(@x)
   if(@y1<=0) set @y1 = len(@y)
   select @z=@z+ cast(cast(substring(@x,1,@x1)as decimal(18,2))+cast(substring(@y,1,@y1)as decimal(18,2)) as varchar)+'#'
     set @x = right(@x,len(@x)-charindex('#',@x))
     set @y = right(@y,len(@y)-charindex('#',@y))
   if(@x='#') set @x = ''
   if(@y='#') set @y = ''
 end
select replace(@z,'.00','') 

---结果展示
/*

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 89#25#1.98#9527#

(1 行受影响)
*/
菜菜菜菜鸟 2012-11-09
  • 打赏
  • 举报
回复
调用函数的时候 记得传参哈
菜菜菜菜鸟 2012-11-09
  • 打赏
  • 举报
回复
Create FUNCTION [dbo].[SplitStr] ( @SourceSql varchar(8000),@StrSeprate varchar(10) ) returns @temp table(Context varchar(100)) as begin declare @i int set @SourceSql=rtrim(ltrim(@SourceSql)) set @i=charindex(@StrSeprate,@SourceSql) while @i>=1 begin insert @temp values(left(@SourceSql,@i-1)) set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i) set @i=charindex(@StrSeprate,@SourceSql) end if @SourceSql<>'' insert @temp values(@SourceSql) return end 直接调用即可 结贴吧
kensouterry1 2012-11-09
  • 打赏
  • 举报
回复


--拆分函数
--CREATE FUNCTION fn_GetSplit(@s varchar(50))
--	RETURNS @t TABLE(rowid int IDENTITY(1,1), value varchar(50))
--AS
--BEGIN

--	;WITH c1 AS
--	(
--		SELECT b.v
--		FROM
--		(
--			SELECT CAST(('<v>' + REPLACE(@s, '#', '</v><v>') + '</v>') AS Xml) s
--		)a
--		CROSS APPLY
--		(
--		 SELECT t.v.value('.','varchar(10)') v
--		 FROM a.s.nodes('//v') t(v)
--		)b
--	)
--	INSERT INTO @t(value)
--	SELECT v
--	FROM c1	
--	RETURN;
--END
--GO


--先把拆分函数fn_GetSplit添加到数据库中
;WITH c1 AS
(
	SELECT  CAST(f1.value as decimal(18,2)) + CAST(f2.value as decimal(18,2)) d1
	FROM fn_GetSplit('1#23#0.98#9527') f1
	JOIN fn_GetSplit('88#2#1#0') f2 ON f1.rowid = f2.rowid
)
SELECT STUFF((SELECT '#'+CAST(d1 AS VARCHAR(50))
			  FROM c1
			  FOR XML PATH('')),1,1,'')

--------------------------
89.00#25.00#1.98#9527.00

(1 行受影响)
發糞塗牆 2012-11-08
  • 打赏
  • 举报
回复
刚想用这个函数,被用了》。
开启时代 2012-11-08
  • 打赏
  • 举报
回复
这样可以累加: --测试 declare @str varchar(20)='1#23#0.98#9527' select SUM(cast(a as Float)) from f_Split(@str,'#')
开启时代 2012-11-08
  • 打赏
  • 举报
回复
create function [dbo].[f_Split] ( @SourceSql nvarchar(max),--源分隔字符串 @StrSeprate varchar(10)--分隔符 ) returns @temp table(a nvarchar(max)) as begin declare @i int set @SourceSql=rtrim(ltrim(@SourceSql)) set @i=charindex(@StrSeprate,@SourceSql) while @i>=1 begin insert @temp values(left(@SourceSql,@i-1)) set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i) set @i=charindex(@StrSeprate,@SourceSql) end if @SourceSql<>'\' insert @temp values(@SourceSql) return end --测试 declare @str varchar(20)='1#23#0.98#9527' select * from f_Split(@str,'#')

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧