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');
使用基础 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');
{
"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');
使用基础 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');