簡體   English   中英

SQL 查詢以逗號分隔的 json 數組值

[英]SQL Query to get the json array values by comma separated

我有以下 Json object。 我需要用逗號(,)分隔的任務名稱。

{
  "Model": [
    {
      "ModelName": "Test Model",    
      "Object": [
         {
           "ID": 1,
           "Name": "ABC",
           "Task" : [
             {
                TaskID : 1222,
                Name: "TaskA"
             },
             {
                TaskID : 154,
                Name: "TaskB"
             }
           ]
         },
         {
           "ID": 11,
           "Name": "ABCD",
           "Task" : [
             {
                TaskID : 222,
                Name: "TaskX"
             },
             {
               TaskID : 234,
               Name: "TaskY"
             }
           ]
        },         
     ]  
 }]}

預期的 Output 應在下表中。 我需要任務名稱應該用逗號分隔。

ModelName   ObjectID   ObjectName  TaskName
Test Model     1          ABC      TaskA, TaskB
Test Model     11         ABCD     TaskX, TaskY

我嘗試了以下查詢。 但我不知道如何對任務名稱進行分組。

                  SELECT   S1.ModelName,
                           S2.ID  AS ObjectID, 
                           S2.Name AS ObjectName, 
                           S3.TaskName
                     FROM TableA 
                       CROSS APPLY OPENJSON(JsonData)
                         WITH (Model NVARCHAR(MAX) '$.Model[0]' AS JSON) S1
                       CROSS APPLY OPENJSON (S1.Model) 
                         WITH (Object NVARCHAR(MAX) '$.Object' AS JSON,
                               ID  INT '$.ID',
                               Name NVARCHAR(250) '$.Name') S2
                       CROSS APPLY OPENJSON (S2.Object) 
                         WITH (Task NVARCHAR(MAX) '$.Task' AS JSON ,
                               TaskName NVARCHAR(MAX) '$.TaskName') S3  

將 json 更正為有效格式,這里是 SQL 查詢,用於您所需的 output。 以下查詢在Oracle 編譯器中編譯並運行良好

SELECT * FROM JSON_TABLE(
    '{"Model":[{"ModelName":"Test Model","Object":[{"ID":1,"Name":"ABC","Task":[{"TaskID":1222,"Name":"TaskA"},{"TaskID":154,"Name":"TaskB"}]},{"ID":11,"Name":"ABCD","Task":[{"TaskID":222,"Name":"TaskX"},{"TaskID":234,"Name":"TaskY"}]}]}]}',
    '$.Model[*]'
    COLUMNS (
       -- L_MODEL_ROWNUM FOR ORDINALITY,
        L_MODEL_NAME VARCHAR2(10) PATH '$.ModelName',
        NESTED PATH '$.Object[*]' COLUMNS (
            --L_OBJECT_ROWNUM FOR ORDINALITY,
            L_OBJECT_ID NUMBER PATH '$.ID',
            L_OBJECT_NAME VARCHAR2(10) PATH '$.Name',
            L_TASK_NAME VARCHAR2(100) FORMAT JSON WITH WRAPPER PATH '$.Task[*].Name'
            )
        )
    )

這是在SQL Server 2019上運行的查詢,

DECLARE @JSONDATA NVARCHAR(MAX);
SET
   @JSONDATA = N'{"Model":[{"ModelName":"Test Model","Object":[{"ID":1,"Name":"ABC","Task":[{"TaskID":1222,"Name":"TaskA"},{"TaskID":154,"Name":"TaskB"}]},{"ID":11,"Name":"ABCD","Task":[{"TaskID":222,"Name":"TaskX"},{"TaskID":234,"Name":"TaskY"}]}]}]}';
WITH TASK AS 
(
   SELECT
      MODEL,
      ID,
      NAME,
      TASK_NAME 
   FROM
      OPENJSON(@JSONDATA) WITH (MODELS NVARCHAR(MAX) '$.Model' AS JSON) CROSS APPLY OPENJSON(MODELS) WITH (MODEL NVARCHAR(80) '$.ModelName', OBJECTS NVARCHAR(MAX) '$.Object' AS JSON) CROSS APPLY OPENJSON(OBJECTS ) WITH (ID INT '$.ID', NAME NVARCHAR(250) '$.Name', TASKS NVARCHAR(MAX) '$.Task' AS JSON ) CROSS APPLY OPENJSON (TASKS) WITH (TASK_NAME NVARCHAR(80) '$.Name') 
)
SELECT DISTINCT
   MODEL AS MODELNAME,
   ID AS OBJECTID,
   NAME AS OBJECTNAME,
   STUFF(( 
   SELECT
      ',' + [TASK_NAME] 
   FROM
      TASK T1 
   WHERE
      T1.[ID] = T2.[ID] FOR XML PATH('')), 1, 1, '') AS TASKNAME 
   FROM
      TASK T2;

暫無
暫無

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

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