Боковая сплющенная снежинка от стола Variant - PullRequest
1 голос
/ 05 марта 2020

У меня есть таблица вариантов под названием raw_json, в которой хранятся несколько файлов json, которые уникальны для идентификатора, но содержат одинаковые точки данных в каждом json. Они живут в столбце jsontext. Вот СС для контекста. Я пытаюсь сгладить каждую строку таблицы raw_json в обычном табличном представлении. Индексы двух массивов необходимо выровнять, чтобы назначить правильные значения.

table name is raw_json

Вот две строки из таблицы raw_json и как json структурирован.

{
 "ID": "PO-103",
 "content": {
   "EEList": [
     {
       "EEListID": "PO-103-1",
       "EEProductID": "XXX1976",

     },
     {
       "EEListID": "PO-103-2",
       "EEProductID": "XXX1977",
     },
     {
       "EEListID": "PO-103-3",
       "EEProductID": "XXX1978",
     }
   ],
   "EENotesList": [
     {
       "FirstName": "John",
       "LastName": "Smith",
       "pxObjClass": "XX-XXSales-Work-XX"
     },
     {
       "FirstName": "Bob",
       "LastName": "Joe",
       "pxObjClass": "XX-XXSales-Work-XX"
     },
     {
       "FirstName": "Mike",
       "LastName": "Smith",
       "pxObjClass": "XX-XXSales-Work-XX"
     }
   ],
 }
}
{
  "ID": "PO-104",
  "content": {
    "EEList": [
      {
        "EEListID": "PO-104-1",
        "EEProductID": "XXX1979",

      },
      {
        "EEListID": "PO-104-2",
        "EEProductID": "XXX1980",
      },
      {
        "EEListID": "PO-104-3",
        "EEProductID": "XXX1981",
      }
    ],
    "EENotesList": [
      {
        "FirstName": "Sarah",
        "LastName": "Butler",
        "pxObjClass": "XX-XXSales-Work-XX"
      },
      {
        "FirstName": "Jessica",
        "LastName": "Adams",
        "pxObjClass": "XX-XXSales-Work-XX"
      }
    ],
  }
}

в таблицу, подобную этой (мне нужно это)

+--------+----------+-------------+-----------+----------+-------------------+
|   ID   | EEListID | EEProductID | FirstName | LastName |    pxObjClass     |
+--------+----------+-------------+-----------+----------+-------------------+
| PO-103 | PO-103-1 | XXX1976     | John      | Smith    | X-XXSales-Work-XX |
| PO-103 | PO-103-2 | XXX1977     | Bob       | Joe      | X-XXSales-Work-XX |
| PO-103 | PO-103-3 | XXX1978     | Mike      | Smith    | X-XXSales-Work-XX |
| PO-104 | PO-104-1 | XXX1979     | Sarah     | Butler   | X-XXSales-Work-XX |
| PO-104 | PO-104-2 | XXX1980     | Jessica   | Adams    | X-XXSales-Work-XX |
+--------+----------+-------------+-----------+----------+-------------------+

Мне удалось сгладить массив EENoteList в таблицу и назначьте правильный идентификатор этой таблице. Вот мой код: добавление значений EEList без разветвления таблицы - вот где я go неверен.

select
    jsontext:ID::varchar as ID,
    en.value:FirstName::varchar as FirstName,
    en.value:LastName::varchar as LastName,
    en.value:pxObjClass::varchar as pxObjClass
   -- concat(ID, EEProductID, FirstName, LastName)

    from raw_json,
    lateral flatten (input => jsontext:content:EENotesList, outer => false) en;

, который создает эту таблицу (у меня есть)

+--------+-----------+----------+-------------------+
|   ID   | FirstName | LastName |    pxObjClass     |
+--------+-----------+----------+-------------------+
| PO-103 | John      | Smith    | X-XXSales-Work-XX |
| PO-103 | Bob       | Joe      | X-XXSales-Work-XX |
| PO-103 | Mike      | Smith    | X-XXSales-Work-XX |
| PO-104 | Sarah     | Butler   | X-XXSales-Work-XX |
| PO-104 | Jessica   | Adams    | X-XXSales-Work-XX |
| PO-104 | Terrence  | Williams | X-XXSales-Work-XX |
+--------+-----------+----------+-------------------+

1 Ответ

1 голос
/ 05 марта 2020

, так что в основном этот ответ является преамбулой для передачи данных в CTE, но «если» порядок двух массивов находится в шаге, вы можете просто использовать индекс flatten для доступа к необработанному массиву другого типа :

WITH raw_json AS (
select PARSE_json(column1) AS jsontext FROM VALUES 
 ('{
 "ID": "PO-103",
 "content": {
   "EEList": [
     {
       "EEListID": "PO-103-1",
       "EEProductID": "XXX1976",

     },
     {
       "EEListID": "PO-103-2",
       "EEProductID": "XXX1977",
     },
     {
       "EEListID": "PO-103-3",
       "EEProductID": "XXX1978",
     }
   ],
   "EENotesList": [
     {
       "FirstName": "John",
       "LastName": "Smith",
       "pxObjClass": "XX-XXSales-Work-XX"
     },
     {
       "FirstName": "Bob",
       "LastName": "Joe",
       "pxObjClass": "XX-XXSales-Work-XX"
     },
     {
       "FirstName": "Mike",
       "LastName": "Smith",
       "pxObjClass": "XX-XXSales-Work-XX"
     }
   ],
 }
}'), ('{
  "ID": "PO-104",
  "content": {
    "EEList": [
      {
        "EEListID": "PO-104-1",
        "EEProductID": "XXX1979",

      },
      {
        "EEListID": "PO-104-2",
        "EEProductID": "XXX1980",
      },
      {
        "EEListID": "PO-104-3",
        "EEProductID": "XXX1981",
      }
    ],
    "EENotesList": [
      {
        "FirstName": "Sarah",
        "LastName": "Butler",
        "pxObjClass": "XX-XXSales-Work-XX"
      },
      {
        "FirstName": "Jessica",
        "LastName": "Adams",
        "pxObjClass": "XX-XXSales-Work-XX"
      }
    ],
  }
}') 
)
select
    jsontext:ID::varchar as ID,
    en.value:FirstName::varchar as FirstName,
    en.value:LastName::varchar as LastName,
    en.value:pxObjClass::varchar as pxObjClass,
    jsontext:content.EEList[en.index].EEListID::text as EEListID,
    jsontext:content.EEList[en.index].EEProductID::text as EEProductID
    from raw_json,
    lateral flatten (input => jsontext:content:EENotesList, outer => false) en;

это приводит к:

ID  FIRSTNAME   LASTNAME    PXOBJCLASS  EELISTID    EEPRODUCTID
PO-103  John    Smith   XX-XXSales-Work-XX  PO-103-1    XXX1976
PO-103  Bob     Joe     XX-XXSales-Work-XX  PO-103-2    XXX1977
PO-103  Mike    Smith   XX-XXSales-Work-XX  PO-103-3    XXX1978
PO-104  Sarah   Butler  XX-XXSales-Work-XX  PO-104-1    XXX1979
PO-104  Jessica Adams   XX-XXSales-Work-XX  PO-104-2    XXX1980
...