{
"dnaSequences": [
{
"id": "seq_fdfdfd",
"fields": {
"ORF": [
"seq_aaaaaa",
"seq_bbbbbbbb",
"seq_ccccccccc",
"seq_ddddddddd"
]
},
"isCircular": false,
"schemaId": "ts_fdfdf"
}
]
}
我正在嘗試使用 SQL Server 中的 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中的前5名和前3名...我只有這個來限制資料量..
uj5u.com熱心網友回復:
您需要嵌套fields.ORF在子查詢中。
不幸的是,SQL Server 不支持JSON_AGG,這會使事情變得更簡單。相反,我們需要用STRING_AGG(聚合)、STRING_ESCAPE(轉義引號)和JSON_QUERY(防止雙重轉義)來破解它。
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小提琴
使用基表執行此操作,而不是必須拆分和重新聚合,會更容易,當然也更高效。如果您正在查詢基表,您可能會遇到這樣的情況:
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');
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/455691.html
