我有一張像這樣的桌子:
| ID | 精氨酸 |
|---|---|
| 1 | {“請求者”:“Alexandre”,“收件人”:[{“first”:“John”,“last”:“Smith”},{“first”:“Elisa”,“last”:“Martin”}, {....}, {"first":"Michael", "last":"Dubois"}]} |
| 2 | {"請求者":"Martin", "收件人":[{"first":"Jean", "last":"Dupont"}, {"first":"Elisa", "last":"Martin"}] } |
| ... | ... |
| n | {"請求者":"Jean", "收件人":[{"first":"Jacques", "last":"Dupont"}, {"first":"Elisa", "last":"Gardner"}, {....},{“第一”:“邁克爾”,“最后”:“杜邦”}]} |
我想擁有的:
| ID | 請求者 | 收件人優先 |
|---|---|---|
| 1 | 亞歷山大 | 約翰 |
| 1 | 亞歷山大 | 酶聯免疫吸附試驗 |
| 1 | 亞歷山大 | ... |
| 1 | 亞歷山大 | 邁克爾 |
| 2 | 馬丁 | 讓 |
| ... | ... | ... |
PS:收件人數量不同。
我的測驗:
select id, JSON_VALUE(args, '$.requester') requester, JSON_VALUE(args, '$.recipients[0].first') recipient
from table
但這個想法是在這里迭代收件人的數量(這里只有 0)
我也做到了這一點:
DECLARE @json nvarchar(max)
select @json = args from table
print @json
SELECT first
FROM OPENJSON( @json, '$.recipients' )
WITH ([first] NVARCHAR(25) '$.first');
它只允許擁有第一行的名字串列。
有誰知道如何得到想要的結果?
uj5u.com熱心網友回復:
兩個級別的OPENJSON應該這樣做:
SELECT t.id, j1.requester, j2.first_name
FROM t
CROSS APPLY OPENJSON(t.args) WITH (
requester NVARCHAR(100) '$.requester',
recipients NVARCHAR(MAX) AS JSON
) AS j1
CROSS APPLY OPENJSON(j1.recipients) WITH (
first_name NVARCHAR(100) '$.first'
) AS j2
uj5u.com熱心網友回復:
我的蠻力方法是用來CROSS APPLY打開 JSON 字串的不同部分......
SELECT
*
FROM
example
CROSS APPLY
(
SELECT *
FROM OPENJSON(example.json)
WITH (
[requester] NVARCHAR(25) '$.requester'
)
)
json_requester
CROSS APPLY
(
SELECT *
FROM OPENJSON(example.json, '$.recipients')
WITH (
[recipient_first] NVARCHAR(25) '$.first',
[recipient_last] NVARCHAR(25) '$.last'
)
)
json_recipient
https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=b79a6ecb271d4322487ede013d54c8e0
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/435480.html
