Одним из возможных решений является синтаксический анализ кода страны с помощью OPENJSON()
, использование соответствующего объединения и агрегирование названий стран. Для SQL Server 2016 вам нужно использовать FOR XML PATH
для агрегирования строк:
Таблицы:
CREATE TABLE Country (
CountryKey int,
CountryName nvarchar(100)
)
INSERT INTO Country
(CountryKey, CountryName)
VALUES
(1, N'USA'),
(2, N'Japan'),
(3, N'China'),
(4, N'UK'),
(5, N'Australia')
CREATE TABLE Store (
Store nvarchar(1),
Countries nvarchar(max)
)
INSERT INTO Store
(Store, Countries)
VALUES
(N'A', N'[1,2]'),
(N'B', N'[1,3]'),
(N'C', N'[1,3,4]'),
(N'D', N'[4,5]'),
(N'E', N'[1,5]')
Оператор:
SELECT s.Store, STUFF(t.Country, 1, 2, N'') AS Country
FROM Store s
CROSS APPLY (
SELECT ', ' + c.CountryName
FROM OPENJSON(s.Countries) WITH (CountryKey int '$') j
LEFT JOIN Country c ON c.CountryKey = j.CountryKey
FOR XML PATH('')
) t (Country)
Результат:
Store Country
A USA, Japan
B USA, China
C USA, China, UK
D UK, Australia
E USA, Australia
Если вы можете перейти на SQL Server 2017, агрегирование строк можно выполнить с помощью STRING_AGG()
:
SELECT s.Store, t.Country
FROM Store s
CROSS APPLY (
SELECT STRING_AGG(c.CountryName, N', ')
FROM OPENJSON(s.Countries) WITH (CountryKey int '$') j
LEFT JOIN Country c ON c.CountryKey = j.CountryKey
) t (Country)