Используйте STUFF() для набора результатов, полученного из OPENJSON

У меня есть ClassTable, как показано ниже, со столбцом Languages, в котором данные находятся в JSON:

ИДЕНТИФИКАТОР Заголовок Языки 1 Класс 1 [{"ID": 1, "Имя": "Английский"}, {"ID": 2, "Имя": "Хинди"}] 2 Класс 2 [{"ID": 1, "Имя": "маратхи"}, {"ID": 2, "Имя": "телугу"}]

и Master таблица Languages как

ИДЕНТИФИКАТОР Имя 1 Английский 2 хинди 3 маратхи 4 телугу

Мне нужен вывод, как показано ниже

ИДЕНТИФИКАТОР Заголовок LanguageID 1 ТестТитле1 1,2

Я пытаюсь добиться этого с помощью 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

Кто-нибудь может сказать мне, какую ошибку я делаю? Или мне нужно попробовать другой подход для этой проблемы?

STUFF имеет к этому мало отношения; все, что он здесь делает, это удаляет первый символ строки. Он не создает строку с разделителями (в приведенном выше примере это было бы FOR XML PATH). Однако, учитывая, что вы используете SQL Server 2017, почему бы не использовать STRING_AGG?
Thom A 24.12.2020 10:22

Спасибо @Larnu за быстрый ответ, но я только что понял, что на моем сервере стоит SQL Server 2016.

Suhas Mandumale 24.12.2020 10:41
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
2
295
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По логике должно работать

 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

Вы хотели опубликовать новый ответ? Почему бы не отредактировать существующий?

Thom A 24.12.2020 11:04

Ага. Предыдущий пост был другим, и я решил уведомить пользователя об удалении ","

SQLServerBuddy 24.12.2020 11:06

Похоже, вы должны были опубликовать комментарий к другому ответу, если это было вашим намерением.

Thom A 24.12.2020 11:08

Да конечно! Позвольте мне принять это к сведению. Спасибо, что позволили мне сейчас об этом

SQLServerBuddy 24.12.2020 11:12

@SQLServerBuddy, что, если я хочу добавить LanguageID в пункт where?

Suhas Mandumale 11.01.2021 08:10

Другие вопросы по теме