Извлечь последний элемент из JSON в ячейке - PullRequest
0 голосов
/ 07 марта 2019

У меня есть столбец с именем submission_date с ячейками json, который выглядит следующим образом:

{"submitted":["January 24, 2019","January 25, 2019","January 30,
2019","February 27, 2019"],"submission_canceled":["January 24, 
2019","January 25, 2019"],"returned":"February 19, 2019"}

или как это:

{"submitted":["February 27, 2019","March 5, 2019"],"submission_canceled":"March 5, 2019"}

Я легко могу получить первый результат из поля "submission_canceled", выполнив:

json_extract(submission_date, "$.submission_canceled[0]")

Я бы подумал, что если бы я хотел использовать последнее значение, я бы сделал:

json_extract(submission_date, "$.submission_canceled[-1]")

Но это просто возвращает мне ноль. Как видите, иногда поле submission_canceled будет содержать несколько дат в списке, а в других случаях оно будет содержать только одну дату, а не список. Я хотел бы получить один элемент или последний элемент в списке из раздела submission_canceled.

1 Ответ

2 голосов
/ 07 марта 2019

Ниже приведен пример для BigQuery Standard SQL

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 id, '{"submitted":["January 24, 2019","January 25, 2019","January 30, 2019","February 27, 2019"],"submission_canceled":["January 24,  2019","January 25, 2019"],"returned":"February 19, 2019"}' submission_date UNION ALL
  SELECT 2, '{"submitted":["February 27, 2019","March 5, 2019"],"submission_canceled":"March 5, 2019"}'
)
SELECT id, REGEXP_REPLACE(ARRAY_REVERSE(SPLIT(JSON_EXTRACT(submission_date, '$.submission_canceled'), '","'))[OFFSET(0)], r'"|\[|\]', '') last_submission_canceled
FROM `project.dataset.table`

с результатом

Row id  last_submission_canceled     
1   1   January 25, 2019     
2   2   March 5, 2019    

Обновление - ниже "более легкая" версия

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 id, '{"submitted":["January 24, 2019","January 25, 2019","January 30, 2019","February 27, 2019"],"submission_canceled":["January 24,  2019","January 25, 2019"],"returned":"February 19, 2019"}' submission_date UNION ALL
  SELECT 2, '{"submitted":["February 27, 2019","March 5, 2019"],"submission_canceled":"March 5, 2019"}'
)
SELECT id, REGEXP_EXTRACT(JSON_EXTRACT(submission_date, '$.submission_canceled'), r'"([^"]*)"\]?$') last_submission_canceled
FROM `project.dataset.table`

с явно тем же результатом

Row id  last_submission_canceled     
1   1   January 25, 2019     
2   2   March 5, 2019    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...