今天記錄一個SQL中的字符串操做,首先來講一個與之相關的業務場景。sql
有兩張表, 一張是教師表,一張是成績表,成績表中有一個審卷老師ID的字段(varchar型,id用了‘;’分割,審卷老師個數>=1), 如今查成績表要求帶出全部審卷老師的名字。 在我如今的認知裏有兩種解決方法:ide
1.自定義一個相似split方法的sql函數,函數
(注:這段代碼轉自一位網友)
1 create FUNCTION [dbo].[F_Split] 2 ( 3 @SplitString nvarchar(max), --源字符串 4 @Separator nvarchar(10)=' ' --分隔符號,默認爲空格 5 ) 6 RETURNS @SplitStringsTable TABLE --輸出的數據表 7 ( 8 [id] int identity(1,1), 9 [value] nvarchar(max) 10 ) 11 AS 12 BEGIN 13 DECLARE @CurrentIndex int; 14 DECLARE @NextIndex int; 15 DECLARE @ReturnText nvarchar(max); 16 17 SELECT @CurrentIndex=1; 18 WHILE(@CurrentIndex<=len(@SplitString)) 19 BEGIN 20 SELECT @NextIndex=charindex(@Separator,@SplitString,@CurrentIndex); 21 IF(@NextIndex=0 OR @NextIndex IS NULL) 22 SELECT @NextIndex=len(@SplitString)+1; 23 SELECT @ReturnText=substring(@SplitString,@CurrentIndex,@NextIndex-@CurrentIndex); 24 INSERT INTO @SplitStringsTable([value]) VALUES(@ReturnText); 25 SELECT @CurrentIndex=@NextIndex+1; 26 END 27 RETURN; 28 END
而後成績表和教師表關聯查詢 , 返回的教師名稱字段用listagg進行分組拼接。spa
2.運用子查詢,雖然子查詢效率不高,可是在通常數據量較小的業務中使用也是無大礙的,使用模糊查詢+listagg函數。code
select (select listagg(o.教師名稱, ';') within group(order by o.教師名稱) from 教師表 o where p.教師IDs like concat(concat('%', o.教師ID), '%')) as 教師名稱s from 成績表 p