目前遇到一個需求是將表A的某欄位內字串分割後,去表B查詢再轉換成中文
沒有學過這麼複雜的sql要分割後又查詢別的表
有前輩能指導怎麼做或用什麼語法指導一下
db ms-sql
舉例
table A
欄位:name,area
area欄位裡面會存 1,2,5 要去查詢
table B
欄位:area,名稱
1,台北
2,桃園
3,台中
4,高雄
5,屏東
表A本來資料
name|area
小明, 1,2,5
小華, 2,4,5
希望結果
小明, 台北,桃園,屏東
小華, 桃園,高雄,屏東
參考~
declare @a table(
	name nvarchar(50)
	,area nvarchar(50)
)
declare @b table(
	area int
	,名稱 nvarchar(50)
)
insert into @a
values(N'小明','1,2,5')
,(N'小華','2,4,5')
insert into @b
values('1','台北')
,('2','桃園')
,('3','台中')
,('4','高雄')
,('5','屏東')
select name
,stuff((
	select ',' + 名稱
	from @b b
	where charindex(',' + Convert(varchar,b.area) + ',',',' + a.area + ',') > 0
	for xml path('')
),1,1,'') arae
from @a a
Declare @Result TABLE ([str] char(1))
Declare @str nvarchar(MAX)
Declare @Value nvarchar(MAX) SET @Value = '1,2,5'
Declare @ss nvarchar(MAX) SET @ss = ','
WHILE (CHARINDEX(@ss,@Value)>0)
BEGIN
	Set @str=SUBSTRING(@Value,1,CHARINDEX(@ss,@Value)-1)
	Insert into @Result([str]) Values (@str)
	
	Set @Value = REPLACE(@Value,@str+@ss,'')
END
IF(LEN(RTRIM(LTRIM(@Value)))>0 And CHARINDEX(@ss,RTRIM(LTRIM(@Value)))=0) 
Begin
    Set @str=@Value 	    
	Insert into @Result ([str]) Values (@str)	    
End 
SELECT * FROM @Result
玩一下,把 table a 資料修改視為旅遊到站記錄
CREATE TABLE a (
  name nvarchar(80),
  area nvarchar(80));
INSERT INTO a
  VALUES (N'小明','1,2,5,2,1')
  , (N'小華','2,3,4,5,4,3,2');
CREATE TABLE b (
  area int,
  areaname nvarchar(80));
INSERT INTO b
  VALUES ('1', N'台北')
  , ('2', N'桃園')
  , ('3', N'台中')
  , ('4', N'高雄')
  , ('5', N'屏東');
SELECT DISTINCT name,
  STUFF((SELECT ',' + TX.areaname
  FROM (SELECT a.name,b.areaname
  FROM a
  CROSS APPLY STRING_SPLIT(a.area, ',') AS C
  LEFT JOIN b ON b.area = CAST(c.value AS int)) TX
  WHERE TX.name = TY.name
  FOR xml PATH ('')), 1, 1, '') AS areanameAll
FROM (SELECT a.name,b.areaname
FROM a
CROSS APPLY STRING_SPLIT(a.area, ',') AS C
LEFT JOIN b ON b.area = CAST(c.value AS int)) TY;