首页 > 解决方案 > 在 SQL Server 中使用 JSON 数组代替传统的关系数据库,每个值在 1 行中

问题描述

我已将答案值按行保存在表格中,在此示例中,1 个答案 1 行,5 行。如果我将它迁移到 JSON 它将是 2 行(JSON)

桌子

ID 选项ID PID 柱子
1 2 1 无效的
2 1 2 无效的
3 1 2 无效的
4 2 2 无效的
5 3 1 无效的

我想计算每个Optionsid有多少个答案(pid)

SELECT COUNT(pid)AS Counted, OptionsId
FROM  Answer GROUP BY [Column], OptionsId

表结果

计数 选项ID
2 1
2 2
1 3

我已经运行了查询并将其保存在一个新表中

select * from Answer  for Json Auto

Json 表 我将 {"answer":} 添加到 Json

ID PID json
1 1 {"答案":[{"Id":1,"Optionsid":2,"Pid":1}]}
2 2 {"Answer":[{"Id":2,"Optionsid":1,"Pid":2},{"Id":2,"Optionsid":1,"Pid":2},{"Id" :3,"Optionsid":2,"Pid":2},{"Id":4,"Optionsid":3,"Pid":2}]}

我想从Json 表中得到与上面的表结果相同的结果,但我可以让它工作这个查询只取数组中的第一个 [0],我想要一个取数组中所有值的查询。有人可以帮我解决这个问题吗?

  Select Count(Json_value ([json], '$.Answer[0].Pid')) as Counted,
  Json_value ([json], '$.Answer[0].Optionsid') as OptionsId
  from [PidJson]
  group by Json_value ([json],'$.Answer[0].Column'),Json_value 
  ([json],'$.Answer[0].Optionsid')

如果您想看,这是一个小提琴

https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=0a2df33717a3917bae699ea3983b70b4

标签: sqljsonsql-server-2016

解决方案


这是解决方案

SELECT Count(JsonData.Pid)  as Counted,  
JsonData.Optionsid
FROM PidJson AS RelationsTab
CROSS APPLY OPENJSON (RelationsTab.json, 
N'$.Answer') 
WITH (
    Pid VARCHAR(200) N'$.Pid',
    Optionsid VARCHAR(200) N'$.Optionsid',
    ColumnValue INT N'$.Column'
   ) AS JsonData
Group by JsonData.ColumnValue, JsonData.Optionsid

感谢您的时间,您“强迫”我澄清我的问题,我找到了解决方案


推荐阅读