iT邦幫忙

0

新手工程師MS SQL 詢問 欄位字串分割查詢子表

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

希望結果
小明, 台北,桃園,屏東
小華, 桃園,高雄,屏東

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
純真的人
iT邦大師 1 級 ‧ 2021-07-08 15:05:13
最佳解答

參考~

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
0
wu2960
iT邦新手 3 級 ‧ 2021-07-08 15:04:44
  1. 下面這段會先把1,2,5拆成3列資料

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

  1. 然後再去join TableB
  2. 最後利用 https://dotblogs.com.tw/supershowwei/2016/01/26/145353
1
rogeryao
iT邦超人 8 級 ‧ 2021-07-09 07:27:22

玩一下,把 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;

Demo

我要發表回答

立即登入回答