Массив внутри элемента внутри массива в варианте

#arrays #json #parsing #element #snowflake-cloud-data-platform

#массивы #json #синтаксический анализ #элемент #снежинка-облако-платформа данных

Вопрос:

Как я могу получить данные из этого массива, хранящиеся в столбце вариантов в Snowflake. Мне все равно, новая ли это таблица, представление или запрос. Существует второй столбец типа varchar(256), который содержит уникальный идентификатор. Если вы можете просто помочь мне прочитать «подтвержденные» данные и данные «editorIds», я, вероятно, смогу взять их оттуда. Большое спасибо!

Примером вывода может быть

 UniqueID    ConfirmationID     EditorID
u3kd9       xxxx-436a-a2d7     nupd
u3kd9       xxxx-436a-a2d7     9l34c
R3nDo       xxxx-436a-a3e4     5rnj
yP48a       xxxx-436a-a477     jTpz8
yP48a       xxxx-436a-a477     nupd
    
[
  {
    "confirmed": {
      "Confirmation": "Entry ID=xxxx-436a-a2d7-3525158332f0: Confirmed order submitted.",
      "ConfirmationID": "xxxx-436a-a2d7-3525158332f0",
      "ConfirmedOrders": 1,
      "Received": "8/29/2019 4:31:11 PM Central Time"
    },
    "editorIds": [
      "xxsJYgWDENLoX",
      "JR9bWcGwbaymm3a8v",
      "JxncJrdpeFJeWsTbT"
    ] ,
    "id": "xxxxx5AvGgeSHy8Ms6Ytyc-1",
    "messages": [],
    "orderJson": {
      "EntryID": "xxxxx5AvGgeSHy8Ms6Ytyc-1",
      "Orders": [
        {
          "DropShipFlag": 1,
          "FromAddressValue": 1,
          "OrderAttributes": [
            {
              "AttributeUID": 548
            },
            {
              "AttributeUID": 553
            },
            {
              "AttributeUID": 2418
            }
          ],
          "OrderItems": [
            {
              "EditorId": "aC3f5HsJYgWDENLoX",
              "ItemAssets": [
                {
                  "AssetPath": "https://xxxx573043eac521.png",
                  "DP2NodeID": "10000",
                  "ImageHash": "000000000000000FFFFFFFFFFFFFFFFF",
                  "ImageRotation": 0,
                  "OffsetX": 50,
                  "OffsetY": 50,
                  "PrintedFileName": "aC3f5HsJYgWDENLoX-10000",
                  "X": 50,
                  "Y": 52.03909266409266,
                  "ZoomX": 100,
                  "ZoomY": 93.75
                }
              ],
              "ItemAttributes": [
                {
                  "AttributeUID": 2105
                },
                {
                  "AttributeUID": 125
                }
              ],
              "ItemBookAttribute": null,
              "ProductUID": 52,
              "Quantity": 1
            }
          ],
          "SendNotificationEmailToAccount": true,
          "SequenceNumber": 1,
          "ShipToAddress": {
            "Addr1": "Addr1",
            "Addr2": "0",
            "City": "City",
            "Country": "US",
            "Name": "Name",
            "State": "ST",
            "Zip": "00000"
          }
        }
      ]
    },
    "orderNumber": null,
    "status": "order_placed",
    "submitted": {
      "Account": "350000",
      "ConfirmationID": "xxxxx-436a-a2d7-3525158332f0",
      "EntryID": "xxxxx-5AvGgeSHy8Ms6Ytyc-1",
      "Key": "D83590AFF0CC0000B54B",
      "NumberOfOrders": 1,
      "Orders": [
        {
          "LineItems": [],
          "Note": "",
          "Products": [
            {
              "Price": "00.30",
              "ProductDescription": "xxxxxint 8x10",
              "Quantity": 1
            },
            {
              "Price": "00.40",
              "ProductDescription": "xxxxxut Black 8x10",
              "Quantity": 1
            },
            {
              "Price": "00.50",
              "ProductDescription": "xxxxx"
            },
            {
              "Price": "00.50",
              "ProductDescription": "xxxscount",
              "Quantity": 1
            }
          ],
          "SequenceNumber": "1",
          "SubTotal": "00.70",
          "Tax": "1.01",
          "Total": "00.71"
        }
      ],
      "Received": "8/29/2019 4:31:10 PM Central Time"
    },
    "tracking": null,
    "updatedOn": 1.598736670503000e 12
  }
]
  

Комментарии:

1. Можете ли вы поделиться тем, как вы хотите видеть выходные данные, которые вы запросили? Это поможет правильно сформировать запрос.

2. Я добавил его в исходное сообщение. Спасибо!

Ответ №1:

Итак, вот как я бы запросил этот точный JSON, предполагая, что данные находятся в столбце var в таблице x :

 SELECT x.var[0]:confirmed:ConfirmationID::varchar as ConfirmationID,
       f.value::varchar as EditorID
FROM x,
LATERAL FLATTEN(input => var[0]:editorIds) f
;
  

Поскольку ваш образец вывода не соответствует предоставленному вами JSON, я предполагаю, что это то, что вам нужно.

Кроме того, в качестве примечания, ваш JSON включает в себя outer [ ], который указывает, что вся строка JSON находится внутри массива. Это причина var[0] в моем запросе. Если у вас есть несколько записей внутри этого массива, вам следует это удалить. В общем, вы должны исключить их и вместо этого загружать каждую запись в таблицу отдельно. Я не был уверен, сможете ли вы внести это изменение, поэтому я просто хотел отметить.

Комментарии:

1. Да, это тот результат, который я искал. Спасибо! ДА. Я хотел бы извлечь несколько элементов из массива в скобках в столбцы. Могу ли я преобразовать это в новую таблицу или представление? Буду ли я использовать тот же процесс, что и выше? И если бы это было сделано, мне больше не нужен был бы синтаксис «[0]»?

2. Запрос, который я использовал выше, можно использовать либо для обновления таблицы, либо для использования представления (материализованный может быть более эффективным, если вам это нужно). Если [ ] всегда находятся в варианте каждой записи, и в этом массиве есть только одна запись данных, то вам нужно будет использовать этот синтаксис [0] .