SQL 带有 FOR JSON PATH 的服务器嵌套对象

SQL Server Nested object with FOR JSON PATH

{
    "dnaSequences": [
        {
            "id": "seq_fdfdfd",
            "fields": {
                "ORF": [
                    "seq_aaaaaa",
                    "seq_bbbbbbbb",
                    "seq_ccccccccc",
                    "seq_ddddddddd"
                ]
            },
            "isCircular": false,
            "schemaId": "ts_fdfdf"
        }
    ]
}

我正在尝试在 SQL 服务器中使用 FOR JSON PATH 创建上面的 JSON...

这是到目前为止的查询...但我似乎无法在 ORF 数组中的嵌套对象周围正确使用双引号?此外,ORF 中的值来自多个记录中的一个字段。

SELECT top 1 id,
       (SELECT top 3 orf_seq_xxx AS 'fields.ORF'
        FROM vw_viewName
        FOR JSON PATH) AS ORF,
       [isCircular],
       [schemaId]
FROM vw_viewNameFOR JSON PATH, ROOT('dnaSequences');

字段:orf_seq_xxx 是通过将数据连接在一起在 sql 视图中创建的。

SUBSTRING((SELECT top 5 ',' + 'seq_aaaaa_' AS 'data()'FROM [v_viewName] FOR XML PATH('')), 2 , 9999)As orf_seq_xxx

可以忽略sql中的top 5和top 3...我只有这个限制数据量..

您需要在子查询中嵌套 fields.ORF

不幸的是SQL服务器不支持JSON_AGG,这会让事情变得更简单。相反,我们需要使用 STRING_AGG(聚合)、STRING_ESCAPE(转义引号)和 JSON_QUERY(防止 double-escaping)来破解它。

SELECT
  t.id,
  [fields.ORF] = JSON_QUERY((
      SELECT '[' + STRING_AGG('"' + STRING_ESCAPE(s.value, 'json') + '"', ',') + ']'
      FROM STRING_SPLIT(t.orf_seq_xxx, ',') s
  )),
  isCircular = CASE WHEN t.isCircular = 'true' THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END,
  t.schemaId
FROM TblName1 t
FOR JSON PATH, ROOT('dnaSequences');

SQL Fiddle

使用基础 table 执行此操作,而不是必须拆分和 re-aggregate,会更容易,而且肯定会更高效。如果您正在查询基数 table,您可能会得到如下内容:

SELECT
  t.id,
  [fields.ORF] = JSON_QUERY(
      '[' + STRING_AGG('"' + STRING_ESCAPE(t.orf_seq_xxx, 'json') + '"', ',') + ']'
  ),
  isCircular = CASE WHEN t.isCircular = 'true' THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END,
  t.schemaId
FROM BaseTable t
GROUP BY
  t.id,
  t.isCircular,
  t.schemaId
FOR JSON PATH, ROOT('dnaSequences');