json - 使用 T-SQL 将 JSON 转换为表

标签 json sql-server tsql

这是JSON输入

{
   "agentID":"WJ",
   "recordType":"AHL",
   "recordReference":{
      "stationCode":"ATL",
      "airlineCode":"XS",
      "recordId":"10001"
   },
   "entries":[
      {
         "bag":{
            "bagType":"22",
            "bagSize":"S",
            "category":"1"
         },
         "seqNo":"1",
         "noOfBagsGiven":"2"
      },
      {
         "bag":{
            "bagType":"23",
            "bagSize":"L",
            "category":"1"
         },
         "seqNo":"2",
         "noOfBagsGiven":"5",
         "dateBagsGiven":"2019-09-18"
      }
   ]
}

这是我希望得到的输出(表格或去限制) enter image description here

我不知道如何遍历子条目,这是我目前所知道的

DECLARE @JSON    VARCHAR(MAX) =
'{
   "agentID":"WJ",
   "recordType":"AHL",
   "recordReference":{
      "stationCode":"ATL",
      "airlineCode":"XS",
      "recordId":"10001"
   },
   "entries":[
      {
         "bag":{
            "bagType":"22",
            "bagSize":"S",
            "category":"1"
         },
         "seqNo":"1",
         "noOfBagsGiven":"2"
      },
      {
         "bag":{
            "bagType":"23",
            "bagSize":"L",
            "category":"1"
         },
         "seqNo":"2",
         "noOfBagsGiven":"5",
         "dateBagsGiven":"2019-09-18"
      }
   ]
}';

SELECT *
FROM   OPENJSON(@json) WITH(agent_id        VARCHAR(2)  '$.agentID'
                           ,record_type     VARCHAR(4)  '$.recordType'
                           ,station_code    VARCHAR(4)  '$.recordReference.stationCode'
                           ,airline_code    VARCHAR(4)  '$.recordReference.airlineCode'
                           ,record_id       INT         '$.recordReference.recordId'
                           ,bag_type        INT         '$.entries.bag.bagType'
                           ,bag_size        VARCHAR(2)  '$.entries.bag.bagSize'
                           ,bag_category    INT         '$.entries.bag.bagCategory'
                           ,date_bags_given DATE        '$.entries.bag.dateBagsGiven'
                           );

最佳答案

另一种可能的方法是使用 JSON_VALUE()(从 JSON 字符串中提取标量值)和 OPENJSON()(到解析 JSON 字符串并以表格形式获取结果):

SELECT 
   JSON_VALUE(@JSON,'$.agentID') AS agentID,
   JSON_VALUE(@JSON,'$.recordType') AS recordType,
   JSON_VALUE(@JSON,'$.recordReference.stationCode') AS stationCode,
   JSON_VALUE(@JSON,'$.recordReference.airlineCode') AS airlineCode,
   JSON_VALUE(@JSON,'$.recordReference.recordId') AS recordId,
   j.*
FROM OPENJSON(@JSON, '$.entries') WITH (
   bagType VARCHAR(10) '$.bag.bagType',
   bagSize VARCHAR(10) '$.bag.bagSize',
   category VARCHAR(10) '$.bag.category',
   seqNo VARCHAR(10) '$.seqNo',
   noOfBagsGiven VARCHAR(10) '$.noOfBagsGiven',
   dateBagsGiven VARCHAR(10) '$.dateBagsGiven'
) AS j

关于json - 使用 T-SQL 将 JSON 转换为表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58067921/

相关文章:

c - 如何解析嵌套的json对象

c# - 到本地的 Azure VPN 无法从 azure Web 应用程序连接 SQL Server

python - 无法从 Linux 机器通过 python 连接 SQL 服务器

sql - 具有递归的 CTE - row_number() 聚合

sql - 带 IN 语法的条件 WHERE 子句

java - 带有 rest-plugin : Map JSON value to ENUM 的 Struts2

javascript - JSON (node/express) 和 JSON 数组中的自定义 "types"

sql - 将 Select(多个结果)的结果存储在一个变量中(稍后在 in 语句中使用)

c# - json 需要一个属性 "@class"。如何在c#中定义

sql-server - SQL Server 通过 sp 或函数将文本从英语转换为其他语言