#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;