SQL研究 - Apply

本文介绍了SQL Server 2005引入的Apply操作符,用于结合表值函数处理数据。通过示例展示了如何利用Apply和自定义的splitString函数统计LocationLog表中各省份出现的次数,提供了解决此类问题的方法。

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

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值