如何使SQL table 的字段值成为SQL 中JSON 对象的键?
How to make the field values of a SQL table to be the keys of JSON object in SQL?
我一直在尝试以我想要的格式从我的数据库中获取一个 JSON 对象,所以我 运行 以下 sql 查询:
SELECT PROJECTS.key_code AS CODE, PROJECTS.name AS Name,
PROJECTS.date AS Date, PROJECTS.descr AS Description
FROM PROJECTS LEFT JOIN ACCESS
ON PROJECTS.key_code = ACCESS.key_code
WHERE ACCESS.Ukey_code = '5d8hd5' FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;
查询结果如下:
{
"Code": "h5P93G",
"Name": "Project1 test name",
"Date": "2017-09-03",
"Description": "This is a test description 1"
},
"Code": "KYJ482",
"Name": "Project2 test name",
"Date": "2018-10-25",
"Description": "This is a test description 2"
}
但实际上我想要的是不同的。 JSON 对象应如下所示:
{
"h5P93G": {
"Name": "Project1 test name",
"Date": "2017-09-03",
"Description": "This is a test description 1"
},
"KYJ482": {
"Name": "Project2 test name",
"Date": "2018-10-25",
"Description": "This is a test description 2"
},
}
那么,我怎样才能得到这个 JSON 对象?
据我所知,您无法真正创建带有 select ... for json
的可变键名的 JSON。
但是,如果您不介意使用变量并且您使用的是 SQL Server 2017(否则您不能为 json-modify
使用动态密钥),您可以这样做:
declare @a nvarchar(max) = '{}'
select
@a = json_modify(
@a,
concat('$."', p.key_code, '"'), /*This line fixed by @Zhorov*/
json_query((select p.name, p.[date], p.descr for json path, without_array_wrapper))
)
from projects as p
select @a
如果您使用的是早期版本的 SQL 服务器,您可以使用您能找到的任何聚合方法对其进行聚合(我在这里使用 string_agg
只是为了简单起见):
select
concat('{', string_agg(
concat('"',p.key_code,'":',p.data),
','
), '}')
from (
select
p.key_code,
(select p.name, p.[date], p.descr for json path, without_array_wrapper) as data
from projects as p
) as p
您也可以考虑使用 string_escape
来防止错误,以防您的密钥包含特殊字符:
select
...
concat('"',string_escape(p.key_code,'json'),'":',p.data),
','
...
我一直在尝试以我想要的格式从我的数据库中获取一个 JSON 对象,所以我 运行 以下 sql 查询:
SELECT PROJECTS.key_code AS CODE, PROJECTS.name AS Name,
PROJECTS.date AS Date, PROJECTS.descr AS Description
FROM PROJECTS LEFT JOIN ACCESS
ON PROJECTS.key_code = ACCESS.key_code
WHERE ACCESS.Ukey_code = '5d8hd5' FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;
查询结果如下:
{
"Code": "h5P93G",
"Name": "Project1 test name",
"Date": "2017-09-03",
"Description": "This is a test description 1"
},
"Code": "KYJ482",
"Name": "Project2 test name",
"Date": "2018-10-25",
"Description": "This is a test description 2"
}
但实际上我想要的是不同的。 JSON 对象应如下所示:
{
"h5P93G": {
"Name": "Project1 test name",
"Date": "2017-09-03",
"Description": "This is a test description 1"
},
"KYJ482": {
"Name": "Project2 test name",
"Date": "2018-10-25",
"Description": "This is a test description 2"
},
}
那么,我怎样才能得到这个 JSON 对象?
据我所知,您无法真正创建带有 select ... for json
的可变键名的 JSON。
但是,如果您不介意使用变量并且您使用的是 SQL Server 2017(否则您不能为 json-modify
使用动态密钥),您可以这样做:
declare @a nvarchar(max) = '{}'
select
@a = json_modify(
@a,
concat('$."', p.key_code, '"'), /*This line fixed by @Zhorov*/
json_query((select p.name, p.[date], p.descr for json path, without_array_wrapper))
)
from projects as p
select @a
如果您使用的是早期版本的 SQL 服务器,您可以使用您能找到的任何聚合方法对其进行聚合(我在这里使用 string_agg
只是为了简单起见):
select
concat('{', string_agg(
concat('"',p.key_code,'":',p.data),
','
), '}')
from (
select
p.key_code,
(select p.name, p.[date], p.descr for json path, without_array_wrapper) as data
from projects as p
) as p
您也可以考虑使用 string_escape
来防止错误,以防您的密钥包含特殊字符:
select
...
concat('"',string_escape(p.key_code,'json'),'":',p.data),
','
...