Есть ли в Snowflake эквивалент jsonb_array_elements? - PullRequest
1 голос
/ 13 февраля 2020

Я недавно перешел на Snowflake и пытаюсь расширить строку JSON, аналогичную функции jsonb_array_elements в Postgres. Ниже приведен пример того, что я имею перед любыми манипуляциями, мы можем назвать эту таблицу mytable

id            date              cost              details
123        2020-02-01           30      {"currency": "USD", "name":"John Smith", "items":[{"type":"hat", "value":"20"}, {"type":"tshirt", "value" : "10"}]}

Обычно я запускаю следующий код в postgres

SELECT
  id,
  date,
  cost as total_cost,
  jsonb_array_elements(details->'items') as details
from mytable

Чтобы получить следующий вывод:

id            date              total_cost              details
123        2020-02-01              30             {"type":"hat" , "value":"20"}
123        2020-02-01              30           {"type":"tshirt" , "value":"10"}

Затем я могу разобрать type и value в свои собственные столбцы.

Есть ли эквивалентный способ сделать это в Снежинке?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Да, есть способ получить этот вывод. Использование табличной функции FLATTEN в соединении LATERAL .

SELECT
  t.id,
  t.date,
  t.cost as total_cost,
  f.*
from mytable t
 , lateral flatten (input => t.details:items) f

Это самая базовая c Синтаксис для того, что вам нужно. Узнайте больше об этой функции, так как она очень мощная.

0 голосов
/ 13 февраля 2020

Можно воспроизвести то, что делал jsonb_array_elements. Вам нужно использовать FLATTEN, проверьте эту документацию для справки.

В вашем конкретном случае c вы сделаете что-то вроде

SELECT 
  id,
  date,
  cost AS total_cost,
  value AS details,
  get_path(value, 'type')::VARCHAR as item_type,
  get_path(value, 'value')::FLOAT as item_cost
FROM my_table AS t,
   lateral flatten(input => parse_json(t.details), path => 'items') f
...