我試圖從 SQL 服務器輸出一些 Json,結果需要能夠處理 2 x 嵌套級別,并且我們不會總是有第二個嵌套級別。
所需的輸出格式如下:
{
"crm_company_id": 165938,
"crm_contact_id": 122908,
"expected_connection_date": "2022-07-01",
"products": [
{
"product_id": "6401",
"quantity": "15",
"cost": "243.55",
"boltons": [
{
"bolton_id": "902",
"quantity": "10",
"cost": "10.00"
},
{
"bolton_id": "903",
"quantity": "5",
"cost": "15.00"
}
]
},
{
"product_id": "6402",
"quantity": "10",
"cost": "43.99"
}
]
}
所以我們可以有從 1 到 N 的任意數量的產品,并且在每個產品中可以有從 0 到 N 的任意數量的 Bolton。我有一個表頭表,然后是一個參考自身的子表來存盤針對產品 My SQL 的 Bolton選擇是:
SELECT prop.crm_company_id
, prop.crm_contact_id
, prop.expected_connection_date
, products.product_id
, products.quantity
, products.cost
, boltons.bolton_id
, boltons.quantity
, boltons.cost
FROM dbo.tblProposal prop
INNER JOIN dbo.tblProduct products
ON products.ProposalID = prop.ID
AND products.ProductID = 0
LEFT JOIN dbo.tblProduct boltons
ON boltons.ProductID = products.ID
如果我使用 JSON AUTO,或者如果我使用 JSON PATH 并放置明確的陣列/列名,它會重復標題,我似乎無法讓 JSon 不包含用于產品的空陣列。我無法完全達到所需的輸出。
uj5u.com熱心網友回復:
您可以只使用嵌套FOR JSON子句。
只要您忽略該INCLUDE_NULL_VALUES選項,缺失的值就會被忽略。
SELECT
prop.crm_company_id
, prop.crm_contact_id
, prop.expected_connection_date
, p.products
FROM dbo.tblProposal prop
CROSS APPLY (
SELECT
products.product_id
, products.quantity
, products.cost
, b.boltons
FROM dbo.tblProduct products
OUTER APPLY (
SELECT
boltons.bolton_id
, boltons.quantity
, boltons.cost
FROM dbo.tblProduct boltons
WHERE boltons.ProductID = products.ID
FOR JSON PATH
) b(boltons)
WHERE products.ProposalID = prop.ID
FOR JSON PATH
) p(products)
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;
uj5u.com熱心網友回復:
您可以使用點分隔的列名來創建所需的嵌套級別。如果您不包含該INCLUDE_NULL_VALUES選項,則不會包含空值。
SELECT prop.crm_company_id
, prop.crm_contact_id
, prop.expected_connection_date
, products.product_id AS 'products.product_id'
, products.quantity AS 'products.quantity',
, products.cost AS 'products.cost'
, boltons.bolton_id AS 'products.boltons.bolton_id'
, boltons.quantity AS 'products.boltons.quantity'
, boltons.cost AS 'products.boltons.cost'
FROM dbo.tblProposal prop
INNER JOIN dbo.tblProduct products
ON products.ProposalID = prop.ID
AND products.ProductID = 0
LEFT JOIN dbo.tblProduct boltons
ON boltons.ProductID = products.ID
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;
來自微軟檔案
FOR JSON PATH 子句使用列別名或列名來確定 JSON 輸出中的鍵名。如果別名包含點,則 PATH 選項會創建嵌套物件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/490929.html
上一篇:將JSON轉換為陣列Xcode
