如何在SQL Server 2016中使用SQL查询创建多级json输出?

时间:2018-04-13 04:41:21

标签: sql json sql-server

这可能在SQL Server 2016中创建一个多级json字符串吗?我有一张这样的表(patient_data):

enter image description here

我想要做的是在SQL Server中创建json字符串输出,如下所示:

{
  "patient":[
    {
      "key":"A",
      "data":[
        {
          "name":"Amy Farha",
          "colored":"darkred",
          "avatar_url":"https://s3.amazonaws.com/uifaces/faces/twitter/ladylexy/128.jpg",
          "subtitle":"Vice President",
          "patientid":"qweqweqeqeq"
        },
        {
          "name":"Anies",
          "colored":"darkblue",
          "avatar_url":"https://s3.amazonaws.com/uifaces/faces/twitter/adhamdannaway/128.jpg",
          "subtitle":"Vice Chairman",
          "patientid":"avasdasdad"
        }
      ]
    },
    {
      "key":"B",
      "data":[
        {
          "name":"Bryan Adams",
          "colored":"darkgreen",
          "avatar_url":"https://randomuser.me/api/portraits/med/women/91.jpg",
          "subtitle":"Reggae Man",
          "patientid":"avasdasdad"
        }
      ]
    },
      {
        "key":"D",
        "data":[
          {
            "name":"David dummy",
            "colored":"darkgreen",
            "avatar_url":"https://randomuser.me/api/portraits/med/women/91.jpg",
            "subtitle":"Reggae Man",
            "patientid":"avasdasdad"
          }
        ]
      },
      {
        "key":"M",
        "data":[
          {
            "name":"Muhammad Adams",
            "colored":"darkgreen",
            "avatar_url":"https://randomuser.me/api/portraits/med/women/91.jpg",
            "subtitle":"Reggae Man",
            "patientid":"avasdasdad"
          }
        ]
      },
      {
        "key":"T",
        "data":[
          {
            "name":"Tere",
            "colored":"darkgreen",
            "avatar_url":"https://randomuser.me/api/portraits/med/women/91.jpg",
            "subtitle":"Reggae Man",
            "patientid":"avasdasdad"
          },
          {
            "name":"Tifanny",
            "colored":"darkblue",
            "avatar_url":"https://s3.amazonaws.com/uifaces/faces/twitter/adhamdannaway/128.jpg",
            "subtitle":"Vice Chairman",
            "patientid":"avasdasdad"
          }
        ]
      },
      {
        "key":"X",
        "data":[
          {
            "name":"Xavier",
            "colored":"darkgreen",
            "avatar_url":"https://randomuser.me/api/portraits/med/women/91.jpg",
            "subtitle":"Reggae Man",
            "patientid":"avasdasdad"
          }
        ]
      }
  ]
}

**注意“密钥”是按患者姓名的第一个字母分组

我尝试使用json路径但在多级案例中无法弄清楚。我希望有人可以帮助我

1 个答案:

答案 0 :(得分:2)

使用FOR JSON PATH

尝试以下查询
-- test data
CREATE TABLE Patients(
  id int,
  name varchar(100)
)

INSERT Patients(id,name)VALUES
(11,'A Patient 11'),(12,'A Patient 12'),
(21,'B Patient 21'),
(31,'C Patient 31'),(32,'C Patient 32')

-- query 1
SELECT
  (
    SELECT
      k.[key],
      (SELECT p.id,p.[name] FROM Patients p WHERE LEFT(p.[name],1)=k.[key] FOR JSON PATH) [data]
    FROM
      (
        SELECT DISTINCT LEFT([name],1) [key]
        FROM Patients
      ) k
    ORDER BY k.[key]
    FOR JSON PATH
  ) patient
FOR JSON PATH

/*
[
    {"patient":[
            {"key":"A","data":[{"id":11,"name":"A Patient 11"},{"id":12,"name":"A Patient 12"}]},
            {"key":"B","data":[{"id":21,"name":"B Patient 21"}]},
            {"key":"C","data":[{"id":31,"name":"C Patient 31"},{"id":32,"name":"C Patient 32"}]}
        ]
    }
]
*/

-- query 2
SELECT
  k.[key] [patient.key],
  (SELECT p.id,p.[name] FROM Patients p WHERE LEFT(p.[name],1)=k.[key] FOR JSON PATH) [patient.data]
FROM
  (
    SELECT DISTINCT LEFT([name],1) [key]
    FROM Patients
  ) k
ORDER BY k.[key]
FOR JSON PATH    

/*
[
    {"patient":{"key":"A","data":[{"id":11,"name":"A Patient 11"},{"id":12,"name":"A Patient 12"}]}},
    {"patient":{"key":"B","data":[{"id":21,"name":"B Patient 21"}]}},
    {"patient":{"key":"C","data":[{"id":31,"name":"C Patient 31"},{"id":32,"name":"C Patient 32"}]}}
]
*/

您可以附加WITHOUT_ARRAY_WRAPPER以删除括号[]

SELECT
  (
    SELECT
      k.[key],
      (SELECT p.id,p.[name] FROM Patients p WHERE LEFT(p.[name],1)=k.[key] FOR JSON PATH) [data]
    FROM
      (
        SELECT DISTINCT LEFT([name],1) [key]
        FROM Patients
      ) k
    ORDER BY k.[key]
    FOR JSON PATH
  ) patient
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER

/*
{
  "patient":[
          {"key":"A","data":[{"id":11,"name":"A Patient 11"},{"id":12,"name":"A Patient 12"}]},
          {"key":"B","data":[{"id":21,"name":"B Patient 21"}]},
          {"key":"C","data":[{"id":31,"name":"C Patient 31"},{"id":32,"name":"C Patient 32"}]}
      ]
}
*/

我发现了另一个更短的变种。您可以在此处使用ROOT('patient')选项

SELECT
  k.[key] [key],
  (SELECT p.id,p.[name] FROM Patients p WHERE LEFT(p.[name],1)=k.[key] FOR JSON PATH) [data]
FROM
  (
    SELECT DISTINCT LEFT([name],1) [key]
    FROM Patients
  ) k
ORDER BY k.[key]
FOR JSON PATH, ROOT('patient')

/*
{
  "patient":[
          {"key":"A","data":[{"id":11,"name":"A Patient 11"},{"id":12,"name":"A Patient 12"}]},
          {"key":"B","data":[{"id":21,"name":"B Patient 21"}]},
          {"key":"C","data":[{"id":31,"name":"C Patient 31"},{"id":32,"name":"C Patient 32"}]}
      ]
}
*/