Сглаживание второго уровня массива Json с изменением значений - PullRequest
0 голосов
/ 28 марта 2020

Я использую Snowflake SQL (новичок в синтаксисе и SQL в целом) и пытаюсь получить доступ ко второму уровню моего массива json, чтобы вывести значение name и . Как вы go углубляетесь в массив json, когда значения постоянно меняются ie Там, где написано Chase Operating - xxxx, есть все разные имена, о которых вы можете подумать, поэтому нет ясного значения ключа для указания .... I Я пытался использовать функцию Flatten, и она просто дублирует то, что у меня уже есть.

Что я делаю не так?

SELECT
    c.id,
    pnl.PREPARED: "balanceSheet"."report"."Assets"."Cash and Cash Equivalents"."rows" as "banks"
    //,lateral flatten(input => parse_json(pnl.PREPARED: "balanceSheet"."report"."Assets"."Cash and Cash Equivalents"."rows"))


FROM
      COMPANY c
      LEFT JOIN pnl on  pnl.COMPANY_ID = c.ID

WHERE
(pnl.PREPARED: "balanceSheet"."report"."Assets"."Cash and Cash Equivalents"."rows") is not null
and pnl.FROM_DATE > '2020-01-31'
AND pnl.TO_DATE   <= '2020-2-29'

Попытка функции Flatten

 ,lateral flatten(input => parse_json(pnl.PREPARED: "balanceSheet"."report"."Assets"."Cash and Cash Equivalents"."rows"))

Результат:

-------------
ID: 10001   

Banks: 
{
  "Chase Operating - 1111": {
    "emphasize": false,
    "name": "Chase Operating - 1111",
    "rawValue": 111.6,
    "value": "112"
  },
  "Chase Payroll - 2222": {
    "emphasize": false,
    "name": "Chase Payroll - 2222",
    "rawValue": 222.21,
    "value": "222"
  }
}

1 Ответ

0 голосов
/ 28 марта 2020

Не уверен, это то, что вы ищете

create or replace table tablename as
                                      select parse_json(column1) as c
                                   from values
                                     ('{ "balanceSheet": { "datePeriod": "Feb 29, 2020", "report": { "Assets": { "Cash and Cash Equivalents": { "rows": { "Chase Operating - 1111"
                                  : { "emphasize": false, "name": "Chase Operating - 1111", "rawValue": 111.6, "value": "112" }, "Chase Payroll - 2222": { "emphasize": false, "na
                                  me": "Chase Payroll - 2222", "rawValue": 222.21, "value": "222" } }}}}}}') v;



select f.value:name::string as name,
       f.value:value::number as value
from tablename p
    ,lateral flatten( input => p.c , path => 'balanceSheet.report.Assets["Cash and Cash Equivalents"].rows' )f;
...