序號 storName CityCode
1 三立廚房-花蓮店 hls
2 長青鱒魚客家菜餐廳 hcs,hcc
3 精華牛排 hcs,hcc
4 維尼斯麵包坊 hcs,hcc
5 富華國際皮件有限公司 hcs,hcc
6 SUM鴻城汽車保修有限公司 tyc
7 隆溢行開運印鑑專門店 tpc
不好意思排版有點亂
想問一下我該如何利用MS SQL語法
將上方資料 StoreName,CityCode 分割成11筆資料
變成
序號 storName CityCode
1 三立廚房-花蓮店 hls
2 長青鱒魚客家菜餐廳 hcs
3 長青鱒魚客家菜餐廳 hcc
4 精華牛排 hcs
5 精華牛排 hcc
.....
.....
....
感激不盡
參考~
Create table Tmp(
序號 int
,storName nvarchar(50)
,CityCode nvarchar(50)
);
insert into Tmp
values(1,N'三立廚房-花蓮店',N'hls')
,(2,N'長青鱒魚客家菜餐廳',N'hcs,hcc')
,(3,N'精華牛排',N'hcs,hcc')
,(4,N'維尼斯麵包坊',N'hcs,hcc')
,(5,N'富華國際皮件有限公司',N'hcs,hcc')
,(6,N'SUM鴻城汽車保修有限公司',N'tyc')
,(7,N'隆溢行開運印鑑專門店',N'tpc');
select *
from Tmp
select Row_Number()Over(order by 序號) as Sort
,storName
,(
select value
from (
select Row_Number()Over(order by value) i
,value
from STRING_SPLIT(CityCode,',')
) k
where i = Sort
) CityCode
from Tmp
,(
select Row_Number()Over(order by [number]) as Sort
from master..spt_values
) as k
where Sort <= len(CityCode) - len(Replace(CityCode,',','')) + 1
order by Row_Number()Over(order by 序號)
https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=6e043aa29c0f7fc10f868da91fc24be3
如果你是低於2016版本~就這樣吧@@...
declare @Tmp table(
序號 int
,storName nvarchar(50)
,CityCode nvarchar(50)
)
insert into @Tmp
values(1,N'三立廚房-花蓮店',N'hls')
,(2,N'長青鱒魚客家菜餐廳',N'hcs,hcc')
,(3,N'精華牛排',N'hcs,hcc')
,(4,N'維尼斯麵包坊',N'hcs,hcc')
,(5,N'富華國際皮件有限公司',N'hcs,hcc')
,(6,N'SUM鴻城汽車保修有限公司',N'tyc')
,(7,N'隆溢行開運印鑑專門店',N'tpc')
select Row_Number()Over(order by 序號) as Sort
,storName
,(
case Sort
when 1 then CAST('<TR><TD>' + REPLACE(CityCode, ',', '</TD><TD>') + '</TD></TR>' AS xml).value('(/TR/TD)[1]','NVARCHAR(50)')
when 2 then CAST('<TR><TD>' + REPLACE(CityCode, ',', '</TD><TD>') + '</TD></TR>' AS xml).value('(/TR/TD)[2]','NVARCHAR(50)')
when 3 then CAST('<TR><TD>' + REPLACE(CityCode, ',', '</TD><TD>') + '</TD></TR>' AS xml).value('(/TR/TD)[3]','NVARCHAR(50)')
when 4 then CAST('<TR><TD>' + REPLACE(CityCode, ',', '</TD><TD>') + '</TD></TR>' AS xml).value('(/TR/TD)[4]','NVARCHAR(50)')
when 5 then CAST('<TR><TD>' + REPLACE(CityCode, ',', '</TD><TD>') + '</TD></TR>' AS xml).value('(/TR/TD)[5]','NVARCHAR(50)')
when 6 then CAST('<TR><TD>' + REPLACE(CityCode, ',', '</TD><TD>') + '</TD></TR>' AS xml).value('(/TR/TD)[6]','NVARCHAR(50)')
when 7 then CAST('<TR><TD>' + REPLACE(CityCode, ',', '</TD><TD>') + '</TD></TR>' AS xml).value('(/TR/TD)[7]','NVARCHAR(50)')
when 8 then CAST('<TR><TD>' + REPLACE(CityCode, ',', '</TD><TD>') + '</TD></TR>' AS xml).value('(/TR/TD)[8]','NVARCHAR(50)')
when 9 then CAST('<TR><TD>' + REPLACE(CityCode, ',', '</TD><TD>') + '</TD></TR>' AS xml).value('(/TR/TD)[9]','NVARCHAR(50)')
when 10 then CAST('<TR><TD>' + REPLACE(CityCode, ',', '</TD><TD>') + '</TD></TR>' AS xml).value('(/TR/TD)[10]','NVARCHAR(50)')
end
) CityCode
from @Tmp
,(
select Row_Number()Over(order by [number]) as Sort
from master..spt_values
) as k
where Sort <= len(CityCode) - len(Replace(CityCode,',','')) + 1
CREATE TABLE Tmp (
No int,
storName nvarchar(50),
CityCode nvarchar(50));
INSERT INTO Tmp VALUES
(1, N'三立廚房-花蓮店', N'hls'),
-- 額外加入 XYZ
(2, N'長青鱒魚客家菜餐廳', N'hcs,hcc,XYZ'),
(3, N'精華牛排', N'hcs,hcc'),
(4, N'維尼斯麵包坊', N'hcs,hcc'),
(5, N'富華國際皮件有限公司', N'hcs,hcc'),
(6, N'SUM鴻城汽車保修有限公司', N'tyc'),
(7, N'隆溢行開運印鑑專門店', N'tpc');
解法一 :
SELECT ROW_NUMBER() OVER (ORDER BY C.No) AS No,C.storName,C.CityCode
FROM (SELECT A.No,A.storName,B.value AS CityCode
FROM Tmp AS A
CROSS APPLY STRING_SPLIT(A.CityCode, ',') AS B) AS C
解法二 :
-- SQL Server 2016 以前不支援 STRING_SPLIT :
;WITH CTE_X0 AS (
SELECT No,storName,CityCode + ',' AS CityCode
FROM Tmp),
CTE_X1 AS (
SELECT No,storName,CityCode,
SUBSTRING(CityCode, 1, CHARINDEX(',', CityCode) - 1) AS STRA,
SUBSTRING(CityCode, CHARINDEX(',', CityCode) + 1, LEN(CityCode) - CHARINDEX(',', CityCode)) AS STRB,
CHARINDEX(',', CityCode) AS NUM
FROM CTE_X0
--
UNION ALL
SELECT No,storName,CityCode,
SUBSTRING(STRB, 1, CHARINDEX(',', STRB) - 1) AS STRA,
SUBSTRING(STRB, CHARINDEX(',', STRB) + 1, LEN(STRB) - CHARINDEX(',', STRB)) AS STRB,
NUM + CHARINDEX(',', STRB) AS NUM
FROM CTE_X1
WHERE LEN(CityCode) - NUM > 0)
SELECT ROW_NUMBER() OVER (ORDER BY C.No) AS No,C.storName,C.STRA AS 'CityCode'
FROM CTE_X1 AS C
使用 PostgreSQL 14
create table it0729 (
id int not null primary key
, sname text not null
, citycode text not null
);
insert into it0729 values
(1, '三立廚房-花蓮店', 'hls'),
-- 額外加入 XYZ
(2, '長青鱒魚客家菜餐廳', 'hcs,hcc,XYZ'),
(3, '精華牛排', 'hcs,hcc'),
(4, '維尼斯麵包坊', 'hcs,hcc'),
(5, '富華國際皮件有限公司', 'hcs,hcc'),
(6, 'SUM鴻城汽車保修有限公司', 'tyc'),
(7, '隆溢行開運印鑑專門店', 'tpc');
select id, sname, string_to_table(citycode, ',')
from it0729;
id sname string_to_table
1 三立廚房-花蓮店 hls
2 長青鱒魚客家菜餐廳 hcs
2 長青鱒魚客家菜餐廳 hcc
2 長青鱒魚客家菜餐廳 XYZ
3 精華牛排 hcs
3 精華牛排 hcc
4 維尼斯麵包坊 hcs
4 維尼斯麵包坊 hcc
5 富華國際皮件有限公司 hcs
5 富華國際皮件有限公司 hcc
6 SUM鴻城汽車保修有限公司 tyc
7 隆溢行開運印鑑專門店 tpc