我需要合并所有作者的特定UID。基本字段正在另一篇文章的代码中工作。
DECLARE @json NVARCHAR(MAX)
SET @json = '{
"header": {
"type": "esummary",
"version": "0.3"
},
"result": {
"uids": [
"17784783",
"19505939",
"30166592"
],
"17784783": {
"uid": "17784783",
"pubdate": "2007 Aug",
"epubdate": "2007 Jul 20",
"source": "PLoS Comput Biol",
"sortpubdate": "2007/08/01 00:00",
"authors": [
{
"name": "Yu Y",
"authtype": "Author",
"clusterid": ""
},
{
"name": "Wang G",
"authtype": "Author",
"clusterid": ""
},
{
"name": "Simha R",
"authtype": "Author",
"clusterid": ""
}
]
,
"19505939": {
"uid": "19505939",
"pubdate": "2009 Aug 1",
"epubdate": "2009 Jun 8",
"source": "Bioinformatics",
"sortpubdate": "2009/08/01 00:00"
},
"authors": [
{
"name": "Zang C",
"authtype": "Author",
"clusterid": ""
}],
"30166592": {
"uid": "30166592",
"pubdate": "2019 Jan",
"epubdate": "2018 Aug 30",
"source": "Oncogene",
"sortpubdate": "2019/01/01 00:00",
"authors": [
{
"name": "Sun J",
"authtype": "Author",
"clusterid": ""
},
{
"name": "Cai X",
"authtype": "Author",
"clusterid": ""
}],
}
}
}'
最后我想结束
uid sortpubdate epubdate Authors
-----------------------------------------------------------------------
17784783 2007/08/01 00:00 2007 Jul 20 Yu Y,Wang G,Simha R
19505939 2009/08/01 00:00 2009 Jun 8 Simha R
30166592 2019/01/01 00:00 2018 Aug 30 Sun J, Cai, X
我在OPENJSON syntax in a stored procedure in SQL Server 2016的Zohar Peled处得到了一个很好的答复,它对第一部分有所帮助,现在我需要看看能否完成此工作。
SELECT [uid], [sortpubdate], [epubdate]
FROM OPENJSON(@json, N'$.result') AS items
CROSS APPLY
-- parse each object in the array
OPENJSON(items.[value])
WITH(
[uid] nvarchar(max) N'$.uid' ,
[sortpubdate] nvarchar(max) N'$.sortpubdate',
[epubdate] nvarchar(max) N'$.epubdate'
) As content
WHERE [key] <> 'uids' -- Get only the relevant content
答案 0 :(得分:1)
您发布的json有点混乱,所以我已经对其进行了编辑。
下一个查询应该使用公用表表达式以及stuff
和for xml
的组合为您提供包括作者姓名在内的结果。
固定的json:
DECLARE @json NVARCHAR(MAX) =
'{
"header": {
"type": "esummary",
"version": "0.3"
},
"result": {
"17784783": {
"uid": "17784783",
"pubdate": "2007 Aug",
"epubdate": "2007 Jul 20",
"source": "PLoS Comput Biol",
"sortpubdate": "2007/08/01 00:00",
"authors": [
{
"name": "Yu Y",
"authtype": "Author",
"clusterid": ""
},
{
"name": "Wang G",
"authtype": "Author",
"clusterid": ""
},
{
"name": "Simha R",
"authtype": "Author",
"clusterid": ""
}
]
},
"19505939": {
"uid": "19505939",
"pubdate": "2009 Aug 1",
"epubdate": "2009 Jun 8",
"source": "Bioinformatics",
"sortpubdate": "2009/08/01 00:00",
"authors": [
{
"name": "Zang C",
"authtype": "Author",
"clusterid": ""
}
]
},
"30166592": {
"uid": "30166592",
"pubdate": "2019 Jan",
"epubdate": "2018 Aug 30",
"source": "Oncogene",
"sortpubdate": "2019/01/01 00:00",
"authors": [
{
"name": "Sun J",
"authtype": "Author",
"clusterid": ""
},
{
"name": "Cai X",
"authtype": "Author",
"clusterid": ""
}
]
},
"uids": [
"17784783",
"19505939",
"30166592"
]
}
}';
使用通用表表达式从json中提取值:
WITH CTE AS
(
SELECT [uid],
[sortpubdate],
[epubdate],
[name]
FROM OPENJSON(@json, N'$.result') AS items
CROSS APPLY
-- parse each object in the array
OPENJSON(items.[value])
WITH(
[uid] nvarchar(max) N'$.uid' ,
[sortpubdate] nvarchar(max) N'$.sortpubdate',
[epubdate] nvarchar(max) N'$.epubdate',
-- Note the AS JSON on the next row - will not work without it!
[authors] nvarchar(max) N'$.authors' AS JSON
) As content
CROSS APPLY
OPENJSON([authors])
WITH ([name] nvarchar(max) N'$.name')
As authorsNames
WHERE items.[key] <> 'uids' -- Get only the relevant content
)
并使用stuff
和for xml
查询cte:
SELECT DISTINCT [uid],
[sortpubdate],
[epubdate],
STUFF((
SELECT ',' + [name]
FROM CTE As t1
WHERE t1.[uid] = t0.[uid]
FOR XML PATH('')
), 1, 1, '') As authors
FROM CTE As t0
结果:
uid sortpubdate epubdate authors
17784783 2007/08/01 00:00 2007 Jul 20 Yu Y,Wang G,Simha R
19505939 2009/08/01 00:00 2009 Jun 8 Zang C
30166592 2019/01/01 00:00 2018 Aug 30 Sun J,Cai X