日期:2014-05-16  浏览次数:20712 次

如何用SQL语句将字段内容拆分后计算
数据库一个字段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           雷雨,安徒生童话,家