目前遇到一個需求是將表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;