怎么用SQL语句将字段内容拆分后计算
如何用SQL语句将字段内容拆分后计算
数据库一个字段book_name,内容如下
id book_name
1 雷雨,安徒生童话,家
2 家
3 春;
4 家;春;秋;
由于系统升级修改过,所以这个字段内容的分割有逗号和分号两种,逗号分隔的末尾无符号,分号分隔的末尾有分号。
怎样将这个字段的内容拆分成单个书名,并且统计各书名的出现次数。
------解决方案--------------------
数据库一个字段book_name,内容如下
id book_name
1 雷雨,安徒生童话,家
2 家
3 春;
4 家;春;秋;
由于系统升级修改过,所以这个字段内容的分割有逗号和分号两种,逗号分隔的末尾无符号,分号分隔的末尾有分号。
怎样将这个字段的内容拆分成单个书名,并且统计各书名的出现次数。
------解决方案--------------------
--创建函数
create function [dbo].[f_splitstr](@SourceSql Nvarchar(MAX),@StrSeprate Nvarchar(100))
returns @temp table(F1 Nvarchar(100))
as
begin
declare @ch as Nvarchar(100)
set @SourceSql=@SourceSql+@StrSeprate
while(@SourceSql<>'')
begin
set @ch=left(@SourceSql,charindex(@StrSeprate,@SourceSql,1)-1)
insert @temp values(@ch)
set @SourceSql=stuff(@SourceSql,1,charindex(@StrSeprate,@SourceSql,1),'')
end
return
end
GO
--生成测试资料
IF EXISTS(SELECT NAME FROM sys.objects AS o WHERE o.name = 'test')
DROP TABLE test
GO
CREATE TABLE test(id INT IDENTITY(1,1) , book_name NVARCHAR(20))
GO
INSERT INTO test(book_name)
SELECT N'雷雨,安徒生童话,家' union all
SELECT N'家' union all
SELECT N'春;' union all
SELECT N'家;春;秋;'
GO
--执行查询
SELECT * FROM test AS t CROSS APPLY dbo.f_splitstr(replace(t.book_name , ',' , ';') , ';') AS fs WHERE FS.F1 <> ''
/*执行结果
id book_name F1
----------- -------------------- ----------------------------------------------------------------------------------------------------
1 雷雨,安徒生童话,家 雷雨
1 雷雨,安徒生童话,家 安徒生童话
1 雷雨,安徒生童话,家 家
2 家 家
3 春; 春
4 家;春;秋; 家
4 家;春;秋; 春
4 家;春;秋; 秋
(8 行受影响)
*/