У меня есть ClassTable, как показано ниже, со столбцом Languages, в котором данные находятся в JSON:
и Master таблица Languages как
Мне нужен вывод, как показано ниже
Я пытаюсь добиться этого с помощью OPENJSON, чтобы получить данные из JSON, а затем я применяю STUFF() к этим данным, чтобы получить LanguageID, разделенные запятыми.
Это запрос, который я написал, но я не получаю ожидаемого результата
SELECT
A.ID,
A.Title,
LanguageIDs = STUFF ((SELECT CONCAT(',',A.ID)
FROM Master.Languages
WHERE ID IN (A.LanguageID)
FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 1, SPACE(0))
FROM
(SELECT
X.ID,
X.Title,
X.CreatedOn,
B.ID as LanguageID
FROM
ClassTable X
CROSS APPLY
OPENJSON(Languages)
WITH (ID INT '$.ID') as B
WHERE
X.ID = 1) AS A
Кто-нибудь может сказать мне, какую ошибку я делаю? Или мне нужно попробовать другой подход для этой проблемы?
Спасибо @Larnu за быстрый ответ, но я только что понял, что на моем сервере стоит SQL Server 2016.

По логике должно работать
SELECT
X.ID,
X.Title,
(
select cast(ID as varchar) +',' from OPENJSON(x.Languages)
WITH (ID INT '$.ID')
for xml path('')
) LanguageID
FROM
ClassTable X where x.id=1
Вы хотели опубликовать новый ответ? Почему бы не отредактировать существующий?
Ага. Предыдущий пост был другим, и я решил уведомить пользователя об удалении ","
Похоже, вы должны были опубликовать комментарий к другому ответу, если это было вашим намерением.
Да конечно! Позвольте мне принять это к сведению. Спасибо, что позволили мне сейчас об этом
@SQLServerBuddy, что, если я хочу добавить LanguageID в пункт where?
STUFFимеет к этому мало отношения; все, что он здесь делает, это удаляет первый символ строки. Он не создает строку с разделителями (в приведенном выше примере это было быFOR XML PATH). Однако, учитывая, что вы используете SQL Server 2017, почему бы не использоватьSTRING_AGG?