SQL研究 - Apply

 

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

發佈了36 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章