powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос к файлу JSON
6 сообщений из 6, страница 1 из 1
Запрос к файлу JSON
    #39867235
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,

Есть примерно такая структура (я ее упростил и уменьшил):

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
DECLARE @json NVARCHAR(MAX)
SET @json = 
N'{
    "id": 1,
    "code": "XYZ",
    "name": "Literacy",
    "studentAssessmentId": 999,
    "studentId": 12345,
    "studentName": "John, Smith",
    "userId": 1234,
    "systemTime": "2019-09-26T02:39:15.587+0000",
    "lodgementId": 456,
    "aspects": [{
            "id": 7097,
            "aspectId": 185,
            "aspectName": "WRITING",
            "value": {
                "studentName": "John, Smith",
                "studentSRN": "TESTSRN",
                "aspectValue": "2"
            },
            "seqNo": 2,
            "score": null,
            "assessmentItems": [{
                    "id": 9007,
                    "assessmentItemId": 3,
                    "itemName": "Q1",
                    "value": "3"
                }, {
                    "id": null,
                    "assessmentItemId": 10,
                    "itemName": "E1",
                    "value": null
                }
            ]
        }, {
            "id": 12679,
            "aspectId": 11,
            "aspectName": "READING",
            "value": {
                "studentName": "John, Smith",
                "studentSRN": "TESTSRN",
                "aspectValue": "0"
            },
            "seqNo": 11,
            "score": null,
            "assessmentItems": [{
                    "id": null,
                    "assessmentItemId": 12,
                    "itemName": "E2",
                    "value": null
                }, {
                    "id": 9706,
                    "assessmentItemId": 13,
                    "itemName": "Q2",
                    "value": "0"
                }, {
                    "id": 15148,
                    "assessmentItemId": 18,
                    "itemName": "Q3",
                    "value": "0"
                }
            ]
        }
    ],
    "rollClass": {
        "id": 385,
        "schoolCode": 104,
        "className": "XY",
        "students": [{
                "id": null,
                "srn": "TESTSRN",
                "firstName": "John",
                "lastName": "Smith"
            }
        ]
    }
}'


select ISJSON(@json)




Мне нужно построить запрос, который вытащит все элементы нижнего уровня (assessmentItems), где itemName не начинается на "E", к ним добавит столбцы из уровня выше (aspects) и самого верхнего уровня, а также вытащит некоторые столбцы из ноды: rollClass

Что-то вроде этого:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT *  FROM OPENJSON(@json)  
  WITH (id bigint '$.aspects.assessmentItems.id',
        studentAssessmentId bigint '$.studentAssessmentId',  -- from the root
        student_id bigint '$.studentId',  -- from the root
        aspectName varchar(128) '$.aspects.aspectName',  -- from the parent
        itemName varchar(128) '$.aspects.assessmentItems.itemName',  
        itemvalue varchar(128) '$.aspects.assessmentItems.value',  
		rollClass varchar(128) '$.rollClass.className')  



Только этот запрос возвращает одну записть, а должен 3: для Q1, Q2 и Q3.

Спасибо.
...
Рейтинг: 0 / 0
Запрос к файлу JSON
    #39867242
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
select
 json_value(a.value, '$.id') as id,
 json_value(b.value, '$.assessmentItemId') as assessmentItemId
from
 openjson(@json, '$.aspects') a cross apply
 openjson(a.value, '$.assessmentItems') b;


До нужного вида допилите самостоятельно.
...
Рейтинг: 0 / 0
Запрос к файлу JSON
    #39867713
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Код: sql
1.
2.
3.
4.
5.
6.
select
 json_value(a.value, '$.id') as id,
 json_value(b.value, '$.assessmentItemId') as assessmentItemId
from
 openjson(@json, '$.aspects') a cross apply
 openjson(a.value, '$.assessmentItems') b;


До нужного вида допилите самостоятельно.

Спасибо, а можно ли к запросу из JSON добавить столбец с функцией? Что-то вроде такого:

Код: sql
1.
2.
3.
4.
SELECT *  FROM OPENJSON(@json)  
  WITH (school_id bigint '$.schoolCode', 
	   student_id int '$.studentId',
  	  [dbo].[fn_pkey](student_id int '$.studentId', 15000, 1, 1))  
...
Рейтинг: 0 / 0
Запрос к файлу JSON
    #39867715
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_mа можно ли к запросу из JSON добавить столбец с функцией? Что-то вроде такого:

Код: sql
1.
2.
3.
4.
SELECT *  FROM OPENJSON(@json)  
  WITH (school_id bigint '$.schoolCode', 
	   student_id int '$.studentId',
  	  [dbo].[fn_pkey](student_id int '$.studentId', 15000, 1, 1))  

Зачем, можно же написать
Код: sql
1.
SELECT ..., [dbo].[fn_pkey](student_id, 15000, 1, 1)
...
Рейтинг: 0 / 0
Запрос к файлу JSON
    #39870924
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Код: sql
1.
2.
3.
4.
5.
6.
select
 json_value(a.value, '$.id') as id,
 json_value(b.value, '$.assessmentItemId') as assessmentItemId
from
 openjson(@json, '$.aspects') a cross apply
 openjson(a.value, '$.assessmentItems') b;


До нужного вида допилите самостоятельно.

Спасибо, а как можно из верхнего уровня в этот запрос вытащить столбец, например studentId. Что-то вроде такого:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select
 json_value(a.value, '$.id') as id,
 json_value(b.value, '$.assessmentItemId') as assessmentItemIdб
  json_value(с.value, '$.studentId') as studentId,
from
 openjson(@json, '$.aspects') a cross apply
 openjson(a.value, '$.assessmentItems') b cross apply
 openjson(@json, '$') c;
...
Рейтинг: 0 / 0
Запрос к файлу JSON
    #39870983
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_mа как можно из верхнего уровня в этот запрос вытащить столбец
Код: sql
1.
2.
3.
4.
5.
6.
7.
select
 json_value(@json, '$.studentId') as studentId,
 json_value(a.value, '$.id') as id,
 json_value(b.value, '$.assessmentItemId') as assessmentItemId
from
 openjson(@json, '$.aspects') a cross apply
 openjson(a.value, '$.assessmentItems') b;
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос к файлу JSON
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]