#sql #json #sql-server
#sql #json #sql-сервер
Вопрос:
У меня есть этот JSON, и мне нужно извлечь 2 строки
- Дочерние элементы
"properties"
в столбце, разделенном запятыми. - Дочерние элементы
"title"
в столбце, разделенном запятыми.
Результаты должны быть
-
BoxTp, boxNo
-
Box Type, Box Number
{
"$schema": "http://json-schema.org/draft-04/schema#",
"properties": {
"BoxTp": {
"title": "Box Type",
"type": [
"null",
"string"
],
"description": "Type"
},
"boxNo": {
"title": "Box Number",
"type": [
"integer",
"null"
],
"description": "Box No.",
"format": "int32"
}
}
}
Комментарии:
1. Не могли бы вы, пожалуйста, поделиться примерами кодов?
Ответ №1:
Вам просто нужно проанализировать входной JSON и объединить результаты. Конечно, вам нужен SQL Server 2016 для использования встроенной поддержки JSON и SQL Server 2017 для агрегирования строк с STRING_AGG()
:
DECLARE @json nvarchar(max) = N'{
"$schema": "http://json-schema.org/draft-04/schema#",
"properties": {
"BoxTp": {
"title": "Box Type",
"type": [
"null",
"string"
],
"description": "Type"
},
"boxNo": {
"title": "Box Number",
"type": [
"integer",
"null"
],
"description": "Box No.",
"format": "int32"
}
}
}'
SELECT STRING_AGG([key], ', ') AS ChildsOfProperties
FROM OPENJSON(@json, '$.properties')
SELECT STRING_AGG(j2.title, ', ') AS ChildsOfTitles
FROM OPENJSON(@json, '$.properties') j1
OUTER APPLY OPENJSON(j1.[value]) WITH (title nvarchar(100) '$.title') j2
Результат:
ChildsOfProperties
-----------------
BoxTp, boxNo
ChildsOfTitles
--------------------
Box Type, Box Number
Если вам нужен один оператор:
SELECT
STRING_AGG(j1.[key], ', ') AS ChildSOfProperties,
STRING_AGG(j2.title, ', ') AS ChildSOfTitles
FROM OPENJSON(@json, '$.properties') j1
OUTER APPLY OPENJSON(j1.[value]) WITH (title nvarchar(100) '$.title') j2