Как обновить данные как массив json и выбрать данные как массив json на сервере sql - PullRequest
2 голосов
/ 24 февраля 2020

Я новичок в SQL server 2017 для JSON результата. Я храню массив JSON в одном столбце в моей таблице. Я сохраняю массив идентификаторов в этой таблице, но я хочу обновить его относительный текст из другой таблицы, поэтому, пожалуйста, помогите мне в этом.

create table #subjectList(subjectID int identity(1,1),subjectName varchar(50))
insert into #subjectList(subjectName)
select 'Math' union all
select 'English' union all
select 'Hindi' union all
select 'PC' union all
select 'Physics'

select * from #subjectList

Create table #studentList(studentID int identity(1,1), subjectName varchar(50), choseSubjectList varchar(max))
insert into #studentList(subjectName, choseSubjectList)
Select 'A','["1","2"]'

select * from #studentList

create table #studentWithSubject(studentID int,subjectName varchar(50),choseSubjectIDList varchar(max),choseSubjectNameList varchar(max))

insert into #studentWithSubject(studentID,subjectName,choseSubjectIDList)
Select a.studentID,a.studentID,a.choseSubjectList
from #studentList a

Update #studentWithSubject set choseSubjectNameList=''

select * from #studentWithSubject

Вот #studentWithSubject вывод

studentID   subjectName choseSubjectIDList  choseSubjectNameList
1              1         ["1","2"]          ''

Теперь я хочу обновить имя субъекта с #subjectList и вывод должен быть таким:

studentID   subjectName choseSubjectIDList  choseSubjectNameList
1              1         ["1","2"]          ["Math","English"]

1 Ответ

1 голос
/ 17 марта 2020

Один из возможных подходов - проанализировать массив JSON с идентификаторами, используя OPENJSON() и схему по умолчанию, а затем сгенерировать массив JSON с именами. Схема OPENJSON() со схемой по умолчанию возвращает таблицу со столбцами key, value и type, а столбцы key содержат индекс каждого элемента. Обратите внимание, что важной частью здесь является генерация имен в том же порядке, в каком они существуют в массиве идентификаторов JSON. Вам нужно использовать метод, основанный на агрегации строк, потому что я не думаю, что вы можете сгенерировать массив JSON со скалярными значениями, используя FOR JSON.

Таблицы:

create table #subjectList(subjectID int identity(1,1),subjectName varchar(50))
insert into #subjectList(subjectName)
select 'Math' union all
select 'English' union all
select 'Hindi' union all
select 'PC' union all
select 'Physics'

Create table #studentList(studentID int identity(1,1), subjectName varchar(50), choseSubjectList varchar(max))
insert into #studentList(subjectName, choseSubjectList)
Select 'A','["1","2"]' union all
Select 'B','["3","2","5"]' union all
Select 'C','["6","2"]'

create table #studentWithSubject(studentID int,subjectName varchar(50),choseSubjectIDList varchar(max),choseSubjectNameList varchar(max))
insert into #studentWithSubject(studentID,subjectName,choseSubjectIDList)
Select a.studentID,a.studentID,a.choseSubjectList
from #studentList a

Заявление:

UPDATE #studentWithSubject
SET choseSubjectNameList = (
    CONCAT(
       '["',
       STUFF(
          (SELECT CONCAT('","', COALESCE(s.subjectName, ''))
          FROM OPENJSON(#studentWithSubject.choseSubjectIDList) j
          LEFT JOIN #subjectList s ON j.[value] = s.subjectID
          ORDER BY CONVERT(int, j.[key])
          FOR XML PATH('')), 1, 3, ''
       ),
       '"]'
    )   
)

Результат:

studentID   subjectName choseSubjectIDList  choseSubjectNameList
1           1           ["1","2"]           ["Math","English"]
2           2           ["3","2","5"]       ["Hindi","English","Physics"]
3           3           ["6","2"]           ["","English"]
...