簡體   English   中英

從Json字符串中提取數據並分成多列

[英]Extract data from Json string and divide into multiple columns

我在具有Jsonstring文本的表中有一列:

[
    {
        "PType":{"code":"9","name":"Hospitality"},
        "PSubType":{"code":"901","name":"Hotel"},
        "AType":{"code":"9","name":"Hospitality"},
        "ASubType":{"code":"901","name":"Hotel"}
    }
]

如何使用SQL Server查詢將其分為多個列?

借助SQL-Server 2016+, 本機JSON支持

DECLARE @json NVARCHAR(MAX)=
N'[
    {
        "PType":{"code":"9","name":"Hospitality"},
        "PSubType":{"code":"901","name":"Hotel"},
        "AType":{"code":"9","name":"Hospitality"},
        "ASubType":{"code":"901","name":"Hotel"}
    }
]';

SELECT A.[key]
      ,JSON_VALUE(A.value,'$.code') AS Code
      ,JSON_VALUE(A.value,'$.name') AS [Name]
FROM OPENJSON(JSON_QUERY(@json,'$[0]')) A;

結果

key         Code    Name
---------------------------------
PType       9       Hospitality
PSubType    901     Hotel
AType       9       Hospitality
ASubType    901     Hotel

一些解釋:

使用JSON_QUERY()您可以獲取數組中的元素, OPENJSON將在其中查找所有對象,並將它們作為派生表返回。

JSON_VALUE將內部信息讀入列。

暗示

對於v2016以下的版本,您應該使用其他工具或考慮CLR功能...

在SQL Server 2016+中,您可以結合使用openjson (更多信息在此處 )和cross apply

declare @json nvarchar(max) = '[ { "PType":{"code":"9","name":"Hospitality"}, "PSubType":{"code":"901","name":"Hotel"}, "AType":{"code":"9","name":"Hospitality"}, "ASubType":{"code":"901","name":"Hotel"} } ]'

select
 [PT].[code] as Ptype_Code
,[PT].[name] as Ptype_Name
,[PS].[code] as PSubType_Code
,[PS].[name] as PSubType_Name
,[AT].[code] as AType_Code
,[AT].[name] as AType_Name
,[AS].[code] as ASubType_Code
,[AS].[name] as ASubType_Name

from   openjson (@json)
with
(
    PType  nvarchar(max) as json,
    PSubType  nvarchar(max) as json,
    AType  nvarchar(max) as json,
    ASubType  nvarchar(max) as json
) as lev1
cross apply openjson (lev1.PType)
with
(
    code int,
    name nvarchar(100)
) as PT
cross apply openjson (lev1.PSubType)
with
(
    code int,
    name nvarchar(100)
) as PS
cross apply openjson (lev1.AType)
with
(
    code int,
    name nvarchar(100)
) as [AT]
cross apply openjson (lev1.ASubType)
with
(
    code int,
    name nvarchar(100)
) as [AS]

結果:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM