Я пытаюсь взять поле STRING, содержащее вложенную структуру JSON, из таблицы с именем my_old_table
, извлечь из нее вложенный массив с именем «alert», а затем вставить его в столбец новой таблицы с именем my_new_table
. Новый столбец определен как:
ARRAY<STRUCT<cuid STRING, title STRING, created TIMESTAMP>>
Я использую это SQL:
INSERT INTO my_dataset.my_table(
id, alerts)
SELECT id, JSON_EXTRACT(extra, "$.alerts") AS content_alerts
FROM my_dataset.my_old_table
Это дает мне:
Query column 2 has type STRING which cannot be inserted into column content_alerts, which has type ARRAY<STRUCT<cuid STRING, title STRING, created TIMESTAMP>> at [4:1]
Я не не вижу способа синтаксического анализа извлеченной строки обратно в структуру .... Есть ли другой способ сделать это?
Редактировать:
Исходное значение json строка , которая выглядит следующим образом:
{
"id": "bar123",
"value": "Test",
"title": "Test",
"alerts": [
{
"id": "abc123",
"title": "Foo",
"created": "2020-01-17T23:18:59.769908Z"
},
{
"id": "abc124",
"title": "Accepting/Denying Claims",
"created": "2020-01-17T23:18:59.769908Z"
}
]
}
Я хочу извлечь $.alerts
и каким-то образом вставить его в ARRAY<STRUCT<cuid STRING, title STRING, created TIMESTAMP>>
.
Edit # 2
Для пояснения, это воспроизводит проблему:
CREATE TABLE insights.my_table
(
id string,
alerts ARRAY<STRUCT<cuid STRING, title STRING, created TIMESTAMP>>
);
CREATE TABLE insights.my_old_table
(
id string,
field STRING
);
INSERT INTO insights.my_old_table(id, field)
VALUES("1", "{\"id\": \"bar123\",\"value\": \"Test\",\"title\": \"Test\",\"alerts\":[{\"id\": \"abc123\",\"title\": \"Foo\",\"created\": \"2020-01-17T23:18:59.769908Z\"},{\"id\": \"abc124\",\"title\": \"Accepting/Denying Claims\",\"created\": \"2020-01-17T23:18:59.769908Z\"}]}");
На основании вышеописанной настройки я не знаю, как извлечь "оповещения" из STRING и вставьте его в поле STRUCT. Я думал, что мог бы добавить туда шаг JSON PARSE, но я не вижу никакой возможности BigQuery для этого. Иначе был бы способ манипулировать JSON СТРУКТУРОЙ, но я тоже этого не вижу. В результате это настолько близко, насколько я мог бы получить:
INSERT INTO insights.my_table(id, alerts)
SELECT id, JSON_EXTRACT(field, "$.alerts") AS alerts FROM insights.my_old_table
Я уверен, что здесь что-то упущено.