SQL Server 对象中的SQL OPENJSON数组

vsmadaxz  于 2023-02-11  发布在  其他
关注(0)|答案(1)|浏览(261)

我有一个具有以下结构/行的表:
| 识别号|选项名称|选项值|
| - ------|- ------|- ------|
| 无|性别问题|男性|
| 1个|性别问题|女性|
我想查询数据库并返回以下JSON:

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

然而,我目前得到的结果是:

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

下面是我的疑问:

SELECT TOP(1) OptionName,
(
    JSON_QUERY(
        (
            SELECT OptionValue 
            FROM [TestJSON].[dbo].[Options] 
            WHERE OptionName = 'Gender' 
            FOR JSON PATH
        )
    )
) AS [Values]
FROM [TestJSON].[dbo].[Options]
WHERE OptionName = 'Gender'
FOR JSON PATH

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

oug3syen

oug3syen1#

尽管SQL Server 2022引入了JSON_ARRAY()函数,但使用它构建具有可变项计数的JSON数组很困难,因此您可以尝试基于字符串的方法:

SELECT DISTINCT o.OptionName, JSON_QUERY(a.[Values]) AS [Values]
FROM Options o
CROSS APPLY (
   SELECT CONCAT('[', STRING_AGG(CONCAT('"', OptionValue, '"'), ','), ']') 
   FROM Options
   WHERE OptionName = o.OptionName
) a ([Values]) 
--WHERE o.OptionName = 'Gender'
FOR JSON PATH

如果您知道每个选项的最大值数(示例中为5),则JSON_ARRAY()PIVOT关系运算符的组合是另一个选项:

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

相关问题