字符拆分应用实例(查找对应位置)

本文介绍了一种利用自定义函数处理复杂字符数据的方法,通过创建特定函数实现对歌曲类型的二进制表示进行拆分,从而高效地查询每首歌所属的类型及其数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/* 作者:htl258(Tony) 标题:字符拆分应用实例 内容: 表1 e_SongType ID text text2 text3 1 的士高 的士高 Disco 2 励志 励志 Encourage 3 舞曲 舞曲 Dance 4 流行 流行 POPmusic .... 表2 Song ID Song singer SongType 1 野人的士高 未知 1000000000000000000000000000000000000000 2 光阴的故事 罗大佑 0101000000000000000000000000000000000000 3 小酒窝 林俊杰 0001000000000000000000000000000000000000 4 我是小沈阳(DJ) 小沈阳 1001000000000000000000000000000000000000 .... 上面是表的部分内容,表2的SongType字节共40位,当第一位等于1时,表1对应ID就是1,依此类推,第几位等于1时,表1的ID就对应几,当出现两个1的时候,证明这首歌有两个类型,就像上面表2的 <光阴的故事>,它的SongType就是励志和流行, <小酒窝>它的SongType就是流行.... 想知道怎样查询这个1的位置对应的内容和个数,如下得到如下结果: BID Song singer SongType SongTypeCount ----------- ---------- ------ ---------------------- ------------------------ 1 野人的士高 未知 的士高 1 2 光阴的故事 罗大佑 励志,流行 2 3 小酒窝 林俊杰 流行 1 4 我是小沈阳(DJ) 小沈阳 的士高,流行 2 时间:2009-09-06 09:42 */ --1.创建测试表 If not object_id('[e_SongType]') is null Drop table [e_SongType] Go Create table [e_SongType]([ID] int,[text] nvarchar(3),[text2] nvarchar(3),[text3] nvarchar(9)) Insert [e_SongType] Select 1,N'的士高',N'的士高',N'Disco' union all Select 2,N'励志',N'励志',N'Encourage' union all Select 3,N'舞曲',N'舞曲',N'Dance' union all Select 4,N'流行',N'流行',N'POPmusic' Go If not object_id('[Song]') is null Drop table [Song] Go Create table [Song]([ID] int,[Song] nvarchar(9),[singer] nvarchar(3),[SongType] nvarchar(40)) Insert [Song] Select 1,N'野人的士高',N'未知',N'1000000000000000000000000000000000000000' union all Select 2,N'光阴的故事',N'罗大佑',N'0101000000000000000000000000000000000000' union all Select 3,N'小酒窝',N'林俊杰',N'0001000000000000000000000000000000000000' union all Select 4,N'我是小沈阳(DJ)',N'小沈阳',N'1001000000000000000000000000000000000000' Go --创建自定义函数 If object_id('dbo.fn_split')is not null Drop function dbo.fn_split Go Create function dbo.fn_split ( @str varchar(8000), --输入的字符串 @type bit --0 返回数量,1 返回位置值 ) returns varchar(1000) as begin declare @s varchar(1000) --用于存储返回的值 if @type=0 set @s=ltrim(len(@str)-len(replace(@str,'1',''))) else while charindex('1',@str)>0 begin select @s=isnull(@s+',','')+[text] from [e_SongType] where id=charindex('1',@str) set @str=stuff(@str,1,charindex('1',@str),'0') end return @s end go --调用函数 select ID,Song,Singer,dbo.fn_split(songtype,1) as SongType,dbo.fn_split(songtype,0) as SongTypeCount from song --结果: /* BID Song singer SongType SongTypeCount ----------- ---------- ------ ---------------------- ------------------------ 1 野人的士高 未知 的士高 1 2 光阴的故事 罗大佑 励志,流行 2 3 小酒窝 林俊杰 流行 1 4 我是小沈阳(DJ) 小沈阳 的士高,流行 2 (4 行受影响) */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值