sql - 将行/表记录转换为sql server中的json文档

标签 sql json sql-server tsql sql-server-2017

以下是作为输入的示例数据

if object_id('tempdb.dbo.#store_data') is not null
drop table #store_data

create table #store_data ([key] nvarchar(max),[value] nvarchar(max),storeid varchar(100)
)

INSERT INTO #store_data VALUES ('sid','1','1')
INSERT INTO #store_data VALUES ('bid','3','1');
INSERT INTO #store_data VALUES ('time','2019-01-01','1');
INSERT INTO #store_data VALUES ('que','apple','1');
INSERT INTO #store_data VALUES ('sid','2','2');
INSERT INTO #store_data VALUES ('bid','5','2');
INSERT INTO #store_data VALUES ('hrs','6','2');
INSERT INTO #store_data VALUES ('dat','pine','2');

select * from #store_data

以下是需要的结果

[{
"sid"="1",
"bid"="3",
"time"="2019-01-01"
"que"="apple"},
{"sid"="2",
"bid"="5",
"hrs"="6",
"dat"="pine"
}]

以下是我尝试过的查询

select [key],[value] from #store_data for json path

没有达到预期效果。

最佳答案

请注意,您无法直接查询,您必须先在storeid上进行PIVOT

您可以尝试以下查询。

select sid, bid, time,que, hrs,dat 
from #store_data src
pivot
(
  MAX([value])
  for [key] in (sid, bid, time,que, hrs,dat)
) piv
for json auto

完整示例

 if object_id('tempdb.dbo.#store_data') is not null
 drop table #store_data

create table #store_data ([key] nvarchar(max),[value] nvarchar(max),storeid varchar(100))

INSERT INTO #store_data VALUES ('sid','1','1')
INSERT INTO #store_data VALUES ('bid','3','1');
INSERT INTO #store_data VALUES ('time','2019-01-01','1');
INSERT INTO #store_data VALUES ('que','apple','1');
INSERT INTO #store_data VALUES ('sid','2','2');
INSERT INTO #store_data VALUES ('bid','5','2');
INSERT INTO #store_data VALUES ('hrs','6','2');
INSERT INTO #store_data VALUES ('dat','pine','2');

select sid, bid, time,que, hrs,dat 
from #store_data src
pivot
(
  MAX([value])
  for [key] in (sid, bid, time,que, hrs,dat)
) piv
for json auto

输出:

[
  {
    "sid": "1",
    "bid": "3",
    "time": "2019-01-01",
    "que": "apple"
  },
  {
    "sid": "2",
    "bid": "5",
    "hrs": "6",
    "dat": "pine"
  }
]

在线演示:

Here

编辑:

PIVOT 会在 stroeid ASC 上自动排序,无需指定任何顺序。如果您想将其更改为不同的顺序,例如DESC stroeid,在这种情况下您可以按如下方式更改查询。

select sid, bid, time,que, hrs,dat 
from #store_data src
pivot
(
  MAX([value])
  for [key] in (sid, bid, time,que, hrs,dat)
) piv
order by storeid desc
for json auto

关于sql - 将行/表记录转换为sql server中的json文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54416604/

相关文章:

java - 在 Java 中使用 JSON 的 HTTP POST

sql-server - T-SQL 将行连接成字符串

sql - 如何在单个命令中更新数据库列值(无 CASE/SWITCH)?

android - 如何在微调器中设置初始文本而不是 json 响应的第一项

MySQL 为每条已经存在的记录插入一条记录

java - 通过嵌套的 JSON 对象循环嵌套并将值保存在数组列表中

sql-server - 优化sql server数据库

c# - 在序列中动态创建图像并重置序列

java - 使用 JOOQ 记录存储过程的绑定(bind)值

mysql - 不带子查询的 ORDER BY COUNT()