sql - 从表列名和数据创建 json 键值
问题描述
是否可以从表语句创建 JSON 键值SELECT
,其中列名作为键,列值作为值
declare @T table(Id int, ItemName varchar(10), CategoryId int, ItemDate date)
insert into @T
values(1,'ABC',100, '1/1/2020')
返回如下内容
{
"id": 1,
"table": "tableName",
"data": [{
"key": "ItemName",
"value": "ABC"
},
{
"key": "CategoryId",
"value": "100"
},
{
"key": "ItemDate",
"value": "1/1/2020"
}
]
}
我看过选择为 JSON 但卡在这里
select *
from @T
for json auto
解决方案
您可以尝试使用VALUES
表值构造函数和FOR JSON AUTO
. 如文档中所述,当...指定 AUTO 选项时,JSON 输出的格式将根据 SELECT 列表中的列顺序及其源表自动确定。
桌子:
CREATE TABLE Tbl (
Id int,
ItemName varchar(10),
CategoryId int,
ItemDate date
)
INSERT INTO Tbl
VALUES
(1, 'ABC', 100, '1/1/2020'),
(2, 'DEF', 200, '2/2/2020')
陈述:
SELECT t.Id, data.[key], data.[value]
FROM Tbl t
CROSS APPLY (VALUES
('ItemName', CONVERT(varchar(max), ItemName)),
('CategoryId', CONVERT(varchar(max), CategoryId)),
('ItemDate', CONVERT(varchar(max), ItemDate))
) Data ([key], [value])
FOR JSON AUTO
结果:
[
{
"Id":1,
"Data":[
{"key":"ItemName", "value":"ABC"},
{"key":"CategoryId","value":"100"},
{"key":"ItemDate","value":"2020-01-01"}
]
},
{
"Id":2,
"Data":[
{"key":"ItemName", "value":"DEF"},
{"key":"CategoryId", "value":"200"},
{"key":"ItemDate", "value":"2020-02-02"}
]
}
]
作为附加选项,您可以尝试为每一行构建内部 JSON:
SELECT
Id,
(
SELECT [key], [value]
FROM (VALUES
('ItemName', CONVERT(varchar(max), ItemName)),
('CategoryId', CONVERT(varchar(max), CategoryId)),
('ItemDate', CONVERT(varchar(max), ItemDate))
) v ([key], [value])
FOR JSON PATH
) AS Data
FROM Tbl
FOR JSON AUTO
推荐阅读
- asp.net-mvc - 哪一个是在 MVC5 中显示标签的最佳实践?
- database - 如何在 Laravel 中创建三个表之间的关系?
- reactjs - Webpack4 在生产模式下,不会在 React.Component 的状态下丑化变量名?
- swift - 如何使用 swift UIView 自定义视图形状?
- sql - 将 varchar 值 '"&Variable.Text&"' 转换为数据类型 int 时转换失败
- python - Pandas:列求和的过滤结果
- mongodb - 如何获取mongodb中嵌入对象内所有字段的平均值?
- c# - Linq to SQL 数据类,使用 machine.config 中的连接字符串
- sql-server - 将 Excel 和 csv 动态加载到 Sql 服务器
- javascript - 从另一个页面pureJS获取元素的innertHTML