как поддерживать порядок элементов с помощью функции snowflake object_construct() вместо сортировки по ключам?

#json #snowflake-cloud-data-platform #object-construction

#json #snowflake-cloud-data-platform #объект-построение

Вопрос:

Следующий запрос snowflake возвращает структуру JSON, но выходные данные отсортированы по ключам. Как не сортировать по ключам, но сохранить порядок? Есть ли какие-либо настройки параметров, которые необходимо установить?

 select
object_construct
(
  'entity',  'XYZ',
  'allowed',  'Yes',
  'currency', 'USD',
  'statement_month','July, 2020'
 )
  

Вывод: —сортирует по ключам

 {
  "allowed": "Yes",
  "currency": "USD",
  "entity": "XYZ",
  "statement_month": "July, 2020"
}
  

Ожидаемый результат: — тот же порядок, что указан

 {
  "entity": "XYZ",
  "allowed": "Yes",
  "currency": "USD",
  "statement_month": "July, 2020"
}
  

Ответ №1:

JSON — это неупорядоченный набор имен и значений. Порядок не может быть гарантирован в JSON.

Созданный объект не обязательно сохраняет исходный порядок пар ключ-значение.

Вы можете сделать это следующим образом

 SELECT mytable:entity::string as entity,
mytable:allowed::string as allowed,
mytable:currency::string as currency,
mytable:statement_month::string as statement_month
from
(select
object_construct
(
  'entity',  'XYZ',
  'allowed',  'Yes',
  'currency', 'USD',
  'statement_month','July, 2020'
 ) mytable);
  

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

1. Спасибо за комментарий, но цель состоит в том, чтобы выдавать выходные данные в формате JSON. Я думаю, что то, что у вас есть, является табличным.

Ответ №2:

К сожалению, нет

Примечания по использованию:https://docs.snowflake.com/en/sql-reference/functions/object_construct.html#usage-notes

Созданный объект не обязательно сохраняет исходный порядок пар ключ-значение.

то же самое для PARSE_JSON Примечания по использованию:https://docs.snowflake.com/en/sql-reference/functions/parse_json.html#usage-notes

Порядок пар ключ-значение в строке, созданной TO_JSON, непредсказуем.

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

1. Правильно. Это то, что я знаю, но просто хотел посмотреть, есть ли какие-либо способы. Хотя спасибо за ответ!

Ответ №3:

Было обнаружено, что порядок сохраняется при использовании object_construct(*):

 WITH base AS (               
SELECT 'XYZ' "entity", 'Yes' "allowed", 'USD' "currency", 'July, 2020' "statement_month")
SELECT object_construct(*) FROM base;