sql - 如何使SQL表的字段值成为SQL中JSON对象的键?

标签 sql json sql-server sql-server-json

我一直试图以我想要的格式从我的数据库中获取一个 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
db fiddle demo
如果您使用的是 SQL Server 的早期版本,则可以使用您能找到的任何聚合方法对其进行聚合(我在这里使用 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
db fiddle demo
您也可以考虑使用 string_escape 防止在您的 key 可能包含特殊字符的情况下出错:
select
    ...
        concat('"',string_escape(p.key_code,'json'),'":',p.data),
        ','
    ...
db fiddle demo

关于sql - 如何使SQL表的字段值成为SQL中JSON对象的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55657439/

相关文章:

sql - 如何在 PostgreSQL 的函数内返回 SELECT 的结果?

python - 使用外键从另一个模型访问对象

python - 将 csv 转换为 JSON 树结构?

java - 将 JSON 对象插入 JSOUP 时出现错误

sql-server - 如何获取varchar列中数值的最大值

mysql - 选择一行,上面一行和下面一行

php - 如何编辑我的查询以显示每天的输出?

python - 如何返回 JSON 请求输入并在另一个函数中使用它?

mysql - 如何将数据从 SQL Server 2005 导出到 MySQL

sql - DateAdd 列导致溢出