SQL研究 - Apply

来源:互联网 发布:程序员穿着标配 编辑:程序博客网 时间:2024/06/11 12:44

 

ApplySQL Server 2005引入的一个新操作符,具有如下的基本语法:

 

select *

from tableA apply table_func(...)

 

Apply左边表的每一行输入右边的函数,该函数根据输入返回一个表,最后输入表的每一行与表结合起来,形成了结果集。

 有必要解释下表值函数,它是返回值为一个表的函数,请参考MSDN的相关文档。

 

现在先看看我们要解决的问题:

如果我们有一张表LocationLog,具有列Locations,内容示例如下:

JiangSu;BeiJing;Shanghai;

FuJian;ShanDong;JiangSu;

...

现在希望统计出各个省份出现的次数。

 

我们假设已经有这样一个函数,如后面附录所示,它能够将输入的一个长字符串分离成几个短字符串,如输入JiangSu;BeiJing;ShangHai,输出应该是:

 1 JiangSu

2 BeiJing

3 ShangHa

该函数名字是splitString。使用Apply,我们可以这样解决问题:

 

select subStr,count(*)

from LocationLog cross apply dbo.splitString(locationRecord

group by subStr

 

结果如下:

BeiJing 1

FuJian 1

JiangSu 2

ShanDong 1

Shanghai 1

 

为了方便读者,我也写出splitString的简单实现。

CREATE FUNCTION dbo.splitString

(

 @strs nvarchar(1024),

 @ch nchar = ';'

)

RETURNS @tmp TABLE

(

 strId int identity(1,1),

 subStr nvarchar(1024)

)

AS

begin

 declare @pos int, @posX int

 set @pos = 1

 while( @pos < len(@strs) )

 begin

  set @posX = charindex(@ch,@strs,@pos)

  if( @posX = 0) set @posX = len(@strs) + 1

  insert into @tmp (subStr) values(substring(@strs,@pos,@posX-@pos))

  set @pos = @posX+1

 end

 RETURN

end

GO

原创粉丝点击