Извлечение полей из строки в массиве JSON - PullRequest
0 голосов
/ 14 июля 2020

Я новичок в снежинке. Я запросил некоторые данные JSON в снежинке, хотя ниже в моем массиве JSON есть длинная строка «метаданных», из которой мне нужно извлечь несколько полей из следующего объекта JSON.

{

  "metaData": "code:VALID_ERROR,message: the provided credentials

  were not correct,type: ITEM_ERROR,exit_status: null,action_id: dax_123,

  action_name: Queentech,

  session_id: 678-902-6y78,type: null,

  name: null,timestamp: 2020-07-11T20:52:59.158Z,timestamp_epoch_sec: 1594500779",

  "statusId": "3478-901fg-u9710"
}

Я дал этому объекту псевдоним header. Я пробовал

select header:statusId::varchar as statusid,
header.metadata.code ::varchar as code,
header.metadata.message::varchar as message 
from test 
where header:status_id ='3478-901fg-u9710'

Я получаю значения NUll для кода и сообщения. Любая помощь будет принята с благодарностью. Спасибо! Тара Палмер

} :: вариант как полезная нагрузка

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

добро пожаловать в Stack Overflow и Snowflake! Документация может помочь выяснить, как запросить столбец VARIANT с помощью объекта JSON. Сначала вам нужно ответить на два вопроса:

  1. Сохраняется ли JSON в вашей таблице как текст? Если это так, вам нужно будет вызвать PARSE_ JSON () в поле.
  2. Вы пытаетесь запросить вложенный массив? Если это так, вам нужно будет использовать FLATTEN () в этом поле.

Убедитесь, что вы понимаете, как ответить на эти два вопроса, прежде чем устранять неполадки. Это упростит процесс устранения неполадок. Когда вы запрашиваете объект в JSON, поле «метаданные» в нем вызывается с помощью header:field_you_want. Обратите внимание, что между полями стоит одно двоеточие. Если вам нужно что-то еще дальше, можно использовать точки. header:field_you_want.some_value

Таким образом, ваш очищенный запрос будет выглядеть примерно так:

select header:statusId as statusid,
header:metadata.code as code,
header:metadata.message as message 
from test 
where header:status_id ='3478-901fg-u9710'
0 голосов
/ 14 июля 2020

Я пробовал подписаться, и это работает. У вас неверное имя столбца. Я не вижу status_id

WITH X AS (
  SELECT PARSE_JSON($1) AS header
    FROM VALUES ($$
{
"metaData": "code:VALID_ERROR,message: the provided credentials were not correct,type: ITEM_ERROR,exit_status: null,action_id: dax_123,action_name: Queentech,session_id: 678-902-6y78,type: null,name: null,timestamp: 2020-07-11T20:52:59.158Z,timestamp_epoch_sec: 1594500779",
"statusId": "3478-901fg-u9710" }
$$)
)
select header:statusId::varchar as statusid
,header:metaData:code ::varchar as code
,header:metadata.message::varchar as message 
from X 
where header:statusId::varchar = '3478-901fg-u9710'
  
;

РЕДАКТИРОВАТЬ: следующий фрагмент только выравнивает столбцы заголовка и метаданных. Он не возвращает результаты, как в исходном запросе. Но этот запрос можно расширить

--Following Json is in correct format
create or replace table sample_json as
  SELECT PARSE_JSON($1) AS header
    FROM VALUES ($$
{
"metaData": "{code:'VALID_ERROR',message: 'the provided credentials were not correct'}",
"statusId": "3478-901fg-u9710" }
$$)
;


  select ,
  g.path , g.value
 from sample_json c,
   lateral flatten(input => header) f
,      lateral flatten(input => parse_json(f.value)) g
where  f.key = 'metaData'
;
...