Я пытаюсь найти решение SQL для организации вывода в соответствии с ожидаемым форматом JSON.
У меня есть простой SQL, чтобы выделить источник этой проблемы;
SELECT TOP 1 'Surname' AS 'name.family'
,'Forename, Middle Name' AS 'name.given'
,'Title' AS 'name.prefix'
,getDATE() AS 'birthdate'
,'F' AS 'gender'
,'Yes' AS 'active'
,'work' AS 'telecom.use'
,'phone' AS 'telecom.system'
,'12344556' AS 'telecom.value'
FROM tblCustomer
FOR json path
, который вернет JSON как;
[
{
"name": {
"family": "Surname",
"given": "Forename, Middle Name",
"prefix": "Title"
},
"birthdate": "2019-02-13T12:06:45.490",
"gender": "F",
"active": "Yes",
"telecom": {
"use": "work",
"system": "phone",
"value": "12344556"
}
}
]
Что мне нужно, этодобавить дополнительные объекты в массив "telecome", чтобы он выглядел как;
[
{
"name": {
"family": "Surname",
"given": "Forename, Middle Name",
"prefix": "Title"
},
"birthdate": "2019-02-13T12:06:45.490",
"gender": "F",
"active": "Yes",
"telecom": {
"use": "work",
"system": "phone",
"value": "12344556"
},
{
"use": "work",
"system": "home",
"value": "12344556"
},
}
]
Я неправильно предположил, что могу продолжать добавлять в свой SQL следующее:
SELECT TOP 1 'Surname' AS 'name.family'
,'Forename, Middle Name' AS 'name.given'
,'Title' AS 'name.prefix'
,getDATE() AS 'birthdate'
,'F' AS 'gender'
,'Yes' AS 'active'
,'work' AS 'telecom.use'
,'phone' AS 'telecom.system'
,'12344556' AS 'telecom.value'
,'home' AS 'telecom.use'
FROM tblCustomer
FOR json path
И это будетоднако вложите элементы в соответствии с моими отступами именования:
Свойство telecom.use не может быть сгенерировано в выводе JSON из-за конфликта с другим именем столбца или псевдонимом.Используйте разные имена и псевдонимы для каждого столбца в списке SELECT.
Есть ли способ обработать эту вложенность с помощью SQL или мне нужно будет создать отдельные запросы JSON и объединить их?
Спасибо
Использование @@ версии Microsoft SQL Server 2017 (окончательная первоначальная версия) - 14.0.1000.169 (X64) 22 августа 2017 г. 17:04:49 Copyright (C) 2017 Microsoft Corporation Express Edition (64-разрядная версия)) в Windows Server 2012 R2 Datacenter 6.3 (сборка 9600:) (гипервизор)
Небольшое изменение вопроса с использованием динамических значений, а не принудительных статических членов.
SELECT TOP 1 'Surname' AS 'name.family'
,'Forename, Middle Name' AS 'name.given'
,'Title' AS 'name.prefix'
,getDATE() AS 'birthdate'
,'F' AS 'gender'
,'Yes' AS 'active'
,'work' AS 'telecom.use'
,'phone' AS 'telecom.system'
,customerWorkTelephone AS 'telecom.value'
,'home' AS 'telecom.use'
,'phone' AS 'telecom.system'
,customerHomeTelephone AS 'telecom.value'
FROM tblCustomer
FOR json path
Элементы "value" будут взяты из столбцов в таблице tblCustomer.Я пытался справиться с ответами ниже, но не могу получить вполне правильную логику в подзапросе.
Еще раз спасибо
ДОПОЛНИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ
У меня есть несколько SQL, которыедает мне результат, который я ожидаю, однако я не уверен, что это лучшее, что могло бы быть, мой подход менее чем оптимален?
SELECT TOP 1 [name.family] = 'Surname'
,[name.given] = 'Forename, Middle Name'
,[name.prefix] = 'Title'
,[birthdate] = GETDATE()
,[gender] = 'F'
,[active] = 'Yes'
,[telecom] = (
SELECT [use] = V.used
,[system] = 'phone'
,[value] = CASE V.used
WHEN 'work'
THEN cu.customerWorkTelephone
WHEN 'home'
THEN cu.customerHomeTelephone
when 'mobile'
then cu.customerMobileTelephone
END
FROM (
VALUES ('work')
,('home')
,('mobile')
) AS V(used)
FOR json path
)
FROM tblCustomer cu
FOR JSON PATH