SQL OPENJSON Array in Objects

huangapple go评论90阅读模式
英文:

SQL OPENJSON Array in Objects

问题

以下是您需要的翻译:

I have a table with the following structure/rows:

ID OptionName OptionValue
0 Gender Male
1 Gender Female

我有一个具有以下结构/行的表格:

ID OptionName OptionValue
0 Gender Male
1 Gender Female

I want to query the database and return the following JSON:

我想查询数据库并返回以下JSON:

[{
"OptionName":"Gender",
"Values":[
"Male",
"Female"
]
}]

我想查询数据库并返回以下JSON:

  1. [{
  2. "OptionName":"Gender",
  3. "Values":[
  4. "Male",
  5. "Female"
  6. ]
  7. }]

However the result I'm currently getting is this:

但是我目前得到的结果是这样的:

  1. [{
  2. "OptionName":"Gender",
  3. "Values":[
  4. {
  5. "OptionValue":"Male"
  6. },
  7. {
  8. "OptionValue":"Female"
  9. }
  10. ]
  11. }]

Here is my Query:

这是我的查询:

  1. SELECT TOP(1) OptionName,
  2. (
  3. JSON_QUERY(
  4. (
  5. SELECT OptionValue
  6. FROM [TestJSON].[dbo].[Options]
  7. WHERE OptionName = 'Gender'
  8. FOR JSON PATH
  9. )
  10. )
  11. ) AS [Values]
  12. FROM [TestJSON].[dbo].[Options]
  13. WHERE OptionName = 'Gender'
  14. FOR JSON PATH

这是我的查询:

  1. SELECT TOP(1) OptionName,
  2. (
  3. JSON_QUERY(
  4. (
  5. SELECT OptionValue
  6. FROM [TestJSON].[dbo].[Options]
  7. WHERE OptionName = 'Gender'
  8. FOR JSON PATH
  9. )
  10. )
  11. ) AS [Values]
  12. FROM [TestJSON].[dbo].[Options]
  13. WHERE OptionName = 'Gender'
  14. FOR JSON PATH

What can I do to get the result I need?

我应该怎么做才能获得我需要的结果?

英文:

I have a table with the following structure/rows:

ID OptionName OptionValue
0 Gender Male
1 Gender Female

I want to query the database and return the following JSON:

  1. [{
  2. "OptionName":"Gender",
  3. "Values":[
  4. "Male",
  5. "Female"
  6. ]
  7. }]

However the result I'm currently getting is this:

  1. [{
  2. "OptionName":"Gender",
  3. "Values":[
  4. {
  5. "OptionValue":"Male"
  6. },
  7. {
  8. "OptionValue":"Female"
  9. }
  10. ]
  11. }]

Here is my Query:

  1. SELECT TOP(1) OptionName,
  2. (
  3. JSON_QUERY(
  4. (
  5. SELECT OptionValue
  6. FROM [TestJSON].[dbo].[Options]
  7. WHERE OptionName = 'Gender'
  8. FOR JSON PATH
  9. )
  10. )
  11. ) AS [Values]
  12. FROM [TestJSON].[dbo].[Options]
  13. WHERE OptionName = 'Gender'
  14. FOR JSON PATH

What can I do to get the result I need?

答案1

得分: 1

虽然 SQL Server 2022 引入了 JSON_ARRAY() 函数,但要使用它构建具有可变项目数量的 JSON 数组比较困难,因此您可以尝试基于字符串的方法:

  1. SELECT DISTINCT o.OptionName, JSON_QUERY(a.[Values]) AS [Values]
  2. FROM Options o
  3. CROSS APPLY (
  4. SELECT CONCAT('[', STRING_AGG(CONCAT('"', OptionValue, '"'), ','), ']')
  5. FROM Options
  6. WHERE OptionName = o.OptionName
  7. ) a ([Values])
  8. --WHERE o.OptionName = 'Gender'
  9. FOR JSON PATH

如果您知道每个选项的最大值数量(例如示例中的 5),还有另一种选择,可以使用 JSON_ARRAY()PIVOT 关系运算符的组合:

  1. SELECT OptionName, JSON_ARRAY([1], [2], [3], [4], [5]) AS [Values]
  2. FROM (
  3. SELECT OptionName, OptionValue, ROW_NUMBER() OVER (PARTITION BY OptionName ORDER BY ID) AS Rn
  4. FROM Options
  5. ) t
  6. PIVOT (MAX(OptionValue) FOR Rn IN ([1], [2], [3], [4], [5])) p
  7. FOR JSON PATH
英文:

Although SQL Server 2022 introduced JSON_ARRAY() function, it's difficult to use it to build a JSON array with variable items count, so you may try a string based approach:

  1. SELECT DISTINCT o.OptionName, JSON_QUERY(a.[Values]) AS [Values]
  2. FROM Options o
  3. CROSS APPLY (
  4. SELECT CONCAT('[', STRING_AGG(CONCAT('"', OptionValue, '"'), ','), ']')
  5. FROM Options
  6. WHERE OptionName = o.OptionName
  7. ) a ([Values])
  8. --WHERE o.OptionName = 'Gender'
  9. FOR JSON PATH

If you know the maximum number of values for each option (5 in the example), a combination of JSON_ARRAY() and PIVOT relational operator is another option:

  1. SELECT OptionName, JSON_ARRAY([1], [2], [3], [4], [5]) AS [Values]
  2. FROM (
  3. SELECT OptionName, OptionValue, ROW_NUMBER() OVER (PARTITION BY OptionName ORDER BY ID) AS Rn
  4. FROM Options
  5. ) t
  6. PIVOT (MAX(OptionValue) FOR Rn IN ([1], [2], [3], [4], [5])) p
  7. FOR JSON PATH

huangapple
  • 本文由 发表于 2023年2月8日 22:46:03
  • 转载请务必保留本文链接:https://go.coder-hub.com/75387448.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定