最近在工作遇到一个数据库查询的问题,大概如下:表Table1中有字段No和Title,每一个No对应一个Title,表Table2中有NoAll字段,NoAll字段的value是No的组合,以逗号隔开,如"111,222,333",现在要查询Table2,根据NoAll将其中的每一个No所对应的Title查询出来也以逗号分隔显示,如:"oec2003,oec2004,oec2004"。表定义如下:
CREATE TABLE Table1 ( No VARCHAR(5), Title VARCHAR(20) ) CREATE TABLE Table2 ( NoAll VARCHAR(100) ) INSERT INTO Table1 VALUES('111','oec2003') INSERT INTO Table1 VALUES('222','oec2004') INSERT INTO Table1 VALUES('333','oec2005') INSERT INTO Table2 VALUES('111,222,333')
因为NoAll是用逗号分隔的,所以要查询其中的每一个No就要将NoAll进行拆分,就想到了写一个split函数,如下:
CREATE FUNCTION Split ( @SourceSql VARCHAR(8000) , @StrSeprate VARCHAR(10) ) RETURNS @temp TABLE ( F1 VARCHAR(100) ) AS BEGIN DECLARE @i INT SET @SourceSql = RTRIM(LTRIM(@SourceSql)) SET @i = CHARINDEX(@StrSeprate, @SourceSql) WHILE @i >= 1 BEGIN INSERT @temp VALUES ( LEFT(@SourceSql, @i - 1) ) SET @SourceSql = SUBSTRING(@SourceSql, @i + 1, LEN(@SourceSql) - @i) SET @i = CHARINDEX(@StrSeprate, @SourceSql) END IF @SourceSql <> '' INSERT @temp VALUES ( @SourceSql ) RETURN END
将NoAll拆分了后返回的是一个Table,Table中的每一行是一个No值,要查出每个No对应的Title就要遍历这个Table,首先想到的就是使用游标,在这里我也是将游标写在了一个函数里,如下:
RETURNS NVARCHAR(2000) AS BEGIN DECLARE @result VARCHAR(2000) SET @result = '' DECLARE getTitle CURSOR FOR SELECT * FROM split(@NoAll, ',') OPEN getTitle DECLARE @No SYSNAME FETCH FROM getTitle INTO @No WHILE @@fetch_status = 0 BEGIN SET @result = @result + ( SELECT Title FROM Table1 WHERE No = @No ) + ',' FETCH FROM getTitle INTO @No END CLOSE getTitle SET @result = SUBSTRING(@result, 0, LEN(@result)) DEALLOCATE getTitle RETURN @result END
最后执行下面语句出想要的结果,如下:
CREATE FUNCTION GetTitle ( @NoAll NVARCHAR(2000) ) SELECT NoAll, dbo.GetTitle(No) AS TitleAll FROM Table2
我这个方法只是将功能实现了,肯定还有更好的方法,欢迎大家讨论