繁体   English   中英

在SQL中解析JSON嵌套数组

[英]Parse JSON Nested Arrays in SQL

这是我几天前遇到的一个问题,我无法在线找到答案,但能够找到一些基础知识并以此为基础。

我将其发布在这里,希望它对遇到类似问题的其他任何人都有用,因为这是我非常喜欢学习的一段代码。

背景:

我们从JSON格式的下游系统接收数据,然后使用SSIS将这些数据作为3列插入到SQL Server实例中:

JSONSTRING NVARCHAR(MAX)
IS_VALID_JSON INT
RECORD_IDENTIFIER Computed NVARCHAR(4000)

我们正在创建解析JSON数据的视图以创建Landing视图,以实现数据的进一步转换和询问。

问题:

在数据解析中,我有嵌套数组的实例,如下所示,其中规则数据作为数组存储在另一个数组中:

{
  "system": {
    "interchange": {
      "received_date": "2018-05-01",
      "schema_version": "ABC123"
    },
    "record": {
      "identifier": "1525165200000999999",
      "version": "20180716220047900"
    },
    "clinical": {
      "procedures": {
        "read": [
          {
            "code": "7516C",
            "code_cleansed": {
              "value": "7516C",
              "was_changed": true,
              "rules": [
                {
                  "rule": "7357"
                },
                {
                  "rule": "TEST"
                }
              ]
            },
            "code_3": "751"
          }
        ]
      }
    }
  }
}

因此,在我看来,我需要访问read []和rules []数组。

我正在尝试MS提供的基本代码示例,这是我完成这项工作的结果:

SELECT
JSON3.[RECORD_IDENTIFIER]
,[EMERGENCY CARE PROCEDURE (SNOMED CT)]
,[PRIORITY TYPE CODE]
,[PROCEDURE_CODE_WAS_CHANGED]
,JSON_VALUE (JSON3.[RULES_ARRAY], '$.rule') AS [PROCEDURE_CODE_WAS_CHANGED_RULE]
,[PROCEDURE_CODE_FIRST_3_CHAR]
,[PROCEDURES_CODE_FIRST_4_CHAR]
,[PROCEDURE DATE]

FROM
    (
    SELECT
        [RECORD_IDENTIFIER]
        ,JSON_VALUE ([PROCEDURES_ARRAY], '$.code') AS [EMERGENCY CARE PROCEDURE (SNOMED CT)]
        ,JSON_VALUE ([PROCEDURES_ARRAY], '$.code_cleansed.value') AS [PRIORITY TYPE CODE]
        ,JSON_VALUE ([PROCEDURES_ARRAY], '$.code_cleansed.was_changed') AS [PROCEDURE_CODE_WAS_CHANGED]
        ,JSON_VALUE ([PROCEDURES_ARRAY], '$.code_3') AS [PROCEDURE_CODE_FIRST_3_CHAR]
        ,JSON_VALUE ([PROCEDURES_ARRAY], '$.date') AS [PROCEDURE DATE]
        ,value AS [RULES_ARRAY]
    FROM
            (
            SELECT
                [RECORD_IDENTIFIER],
                value AS [PROCEDURES_ARRAY]
            FROM
                [LND].[OP_JSON_REPORT_LAND]
                 CROSS APPLY OPENJSON ([JSONSTRING],'$.clinical.procedures.read')
            ) AS JSON CROSS APPLY OPENJSON ([PROCEDURES_ARRAY], '$.code_cleansed.rules') AS JSON2
    ) AS JSON3

我希望这对某人有帮助,感谢您的阅读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM