【问题标题】:SQL Query to get the json array values by comma separatedSQL Query 以逗号分隔获取 json 数组值
【发布时间】:2020-05-03 10:21:29
【问题描述】:

我有下面的 Json 对象。我需要用逗号(,)分隔的任务名称。

{
  "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"
             }
           ]
        },         
     ]  
 }]}

预期的输出应在下表中。我需要任务名称应该用逗号分隔。

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对象是怎么得到的。
  • 不要将值存储为 csv。重新设计您的数据库
  • @isuru 我从模型中获取 Json 对象。我存储到表格列中。我只需要将 q 查询写入该 Json 列。
  • @Jens 这不是 .csv。这是一个 JSON 对象。 SQL Server 2019 支持这一点。
  • @AshokYaganti 'TaskA, TaskB' 是逗号分隔值...如果您要提取 JSON 数据,也请对其进行规范化。到目前为止,您尝试了什么,为什么没有成功?

标签: sql json sql-server-2019


【解决方案1】:

已将 json 更正为有效格式,这是您所需输出的 ​​SQL 查询。以下查询在Oracle Compiler中编译并运行良好

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;

【讨论】:

  • 这不是有效的 T-SQL。varchar2 在 SQL Server 中甚至不是有效的数据类型。 Oracle 同样是一个完全不同的 RDBMS。
  • @AshokYaganti 添加了 SQL 服务器查询以获得所需的输出
猜你喜欢
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 2017-08-04
相关资源
最近更新 更多