关于SQL格式化字符串的问题。。。

huncker 2010-05-25 09:06:48
先谢谢各位大侠了,小弟现在碰到的问题是:
数据库中的一个字段存有类似以下的字符串:
1:abcg,2:cdef,4:tuyys,90:ioijj
在‘:’前面的表示的是ID,之后是用户名,多个用户以‘,’来分开,
现在要做的是把这一个字符串格式化成如下的ID串:
1,2,4,90

小弟拜谢了。。。。
...全文
399 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
huncker 2010-05-25
  • 打赏
  • 举报
回复
嗯我已经用了chuifengde的方法了,楼上的几位厌大侠也都可行!
小弟谢过各位了~~~
feilniu 2010-05-25
  • 打赏
  • 举报
回复
单语句解决方案(需要SS2005或以上):

DECLARE @s varchar(max)
SET @s = '1:abcg,2:cdef,4:tuyys,90:ioijj'

SELECT STUFF((
SELECT ',' + LEFT(v,CHARINDEX(':',v)-1)
FROM (
--BEGIN:
--以下语句可专门用于拆分字符串
SELECT v = x.n.value('.','varchar(100)')
FROM (
SELECT ValuesXML = CAST('<root>' +
REPLACE((SELECT v = @s FOR XML PATH('')),',','</v><v>') +
'</root>' AS XML)
) t
CROSS APPLY t.ValuesXML.nodes('/root/v') x(n)
--END
) tmp
FOR XML PATH('')
),1,1,'')
htl258_Tony 2010-05-25
  • 打赏
  • 举报
回复
if object_id('[f_getstr]') is not null
drop function f_getstr
go
create function f_getstr(@s varchar(1000))
returns varchar(1000)
as
begin
if right(@s,1)<>',' set @s=@s+','
while @s like '%:%,%'
select @s=replace(@s,substring(@s,charindex(':',@s),charindex(',',@s)-charindex(':',@s)+1),';;')
while charindex(';;',@s)>0
select @s=replace(@s,';;',',')
return left(@s,len(@s)-1)
end
go
declare @s varchar(8000)
set @s='1:abcg,2:cdef,4:tuyys,90:ioijj'
select dbo.f_getstr(@s)
/*
1,2,4,90

(1 行受影响)
*/
chuifengde 2010-05-25
  • 打赏
  • 举报
回复

create table aa_(id int,a varchar(100))
INSERT aa_ SELECT 1,'1:abcg,2:cdef,4:tuyys,90:ioijj'
INSERT aa_ SELECT 2,'33:abcgg,76:cdeghhf,23:tuykkys,2345:ioaasdfijj'
go
CREATE FUNCTION Get_A_(@a VARCHAR(100))
RETURNS VARCHAR(100)
BEGIN
DECLARE @s VARCHAR(100)
DECLARE @t VARCHAR(100)
SET @a=@a+','
WHILE CHARINDEX(',',@a)>0
BEGIN
set @t=LEFT(@a,CHARINDEX(',',@a))
set @s=isnull(@s+',','')+LEFT(@t,CHARINDEX(':',@t)-1)
SET @a=REPLACE(@a,@t,'')
END
RETURN @s
END

SELECT *,dbo.get_A_(a) FROM aa_
/*
id a
----------- ---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
1 1:abcg,2:cdef,4:tuyys,90:ioijj 1,2,4,90
2 33:abcgg,76:cdeghhf,23:tuykkys,2345:ioaasdfijj 33,76,23,2345

(所影响的行数为 2 行)


*/
永生天地 2010-05-25
  • 打赏
  • 举报
回复
declare  @str  varchar(300)  
declare @r varchar(300)
set @str='1:abcg,2:cdef,4:tuyys,90:ioijj'
declare @i int
declare @len int

set @i = 1
set @r=''
while @i < len(@str+',')
begin
set @r=@r+(substring(@str+',',@i,charindex(',',@str+',',@i)-@i) )
set @r=left(@r,charindex(':',@r)-1)+','
set @i = charindex(',',@str+',',@i)+1
end
select left(@r,len(@r)-1)

/*

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1,2,4,90

(所影响的行数为 1 行)

*/
huncker 2010-05-25
  • 打赏
  • 举报
回复
能给个实例吗?
htl258_Tony 2010-05-25
  • 打赏
  • 举报
回复
做个函数就可以了
huncker 2010-05-25
  • 打赏
  • 举报
回复
谢谢楼上的大侠。。。能否写成一个单独的语句呢?
永生天地 2010-05-25
  • 打赏
  • 举报
回复
参考

create table #t(
id varchar(10))
declare @str varchar(300)
set @str='12,13,14,20'
declare @i int
declare @len int

set @i = 1
while @i < len(@str+',')
begin
insert #t select substring(@str+',',@i,charindex(',',@str+',',@i)-@i)
set @i = charindex(',',@str+',',@i)+1
end
select * from #t
/*
id
----------
12
13
14
20

(所影响的行数为 4 行)
*/
--drop table #t

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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