Большая структура обновления запроса до нуля в повторяющемся поле

В Google bigquery я пытаюсь обновить повторяющееся поле.

Для сравнения, это работает (или, по крайней мере, помечено как действительное), но, конечно, на самом деле не обновляет поле.

UPDATE my.table t
SET my_field = ARRAY(
  SELECT AS STRUCT g.foo, g.bar, g.struct_to_set_null
  FROM unnest(t.groups) as g
), ... FROM ... etc

Установка struct_to_set_null в ноль дает ошибку:

UPDATE my.table t
SET my_field = ARRAY(
  SELECT AS STRUCT g.foo, g.bar, null as struct_to_set_null
  FROM unnest(t.groups) as g
), ... FROM ... etc

Value of type ARRAY<STRUCT<... (really long and cut off) cannot be assigned to groups, which has type <ARRAY,STRUCT<... (same, really long, cut off)

Я вижу, что рассматриваемое поле относится к типу RECORD и NULLABLE, поэтому я думаю, что установка его на null разрешена. Есть ли способ заставить это работать?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
2 931
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Repeated - это тип массива, поэтому для него нельзя установить значение NULL.

В настоящее время BigQuery имеет два следующих ограничения в отношении NULL и ARRAYs:

  • BigQuery выдает ошибку, если в результате запроса есть ARRAYs, содержащий элементы NULL, хотя такой ARRAYs можно использовать внутри запроса.
  • BigQuery переводит NULL ARRAY в пустой ARRAY в результате запроса, хотя внутри запроса NULL и пустой ARRAYs представляют собой два разных значения.
Ответ принят как подходящий

Проблема в том, что BigQuery не выводит тип поля структуры только из литерала NULL; вам нужно быть более откровенным. Вот пример:

CREATE TABLE tmp_elliottb.UpdateTable (
  my_field ARRAY<STRUCT<foo INT64, bar INT64, struct_to_set_null STRUCT<x STRING, y BOOL, z INT64>>>
);

UPDATE tmp_elliottb.UpdateTable
SET my_field = ARRAY(
  SELECT AS STRUCT foo, bar, NULL AS struct_to_set_null FROM UNNEST(my_field)
)
WHERE true;

Это дает мне:

Value of type ARRAY<STRUCT<foo INT64, bar INT64, struct_to_set_null INT64>> cannot be assigned to my_field, which has type ARRAY<STRUCT<foo INT64, bar INT64, struct_to_set_null STRUCT<x STRING, y BOOL, z INT64>>> at [4:16]

Вместо этого я могу использовать выражение IF, которое производит NULL, но имеет struct_to_set_null в одной из ветвей, чтобы принудительно задать нужный мне тип вывода:

UPDATE tmp_elliottb.UpdateTable
SET my_field = ARRAY(
  SELECT AS STRUCT
    foo, bar,
    IF(false, struct_to_set_null, NULL) AS struct_to_set_null 
  FROM UNNEST(my_field)
)
WHERE true;

Или, как вариант, я могу использовать SELECT * REPLACE:

UPDATE tmp_elliottb.UpdateTable
SET my_field = ARRAY(
  SELECT AS STRUCT * REPLACE (IF(false, struct_to_set_null, NULL) AS struct_to_set_null )
  FROM UNNEST(my_field)
)
WHERE true;

Обожаю этот трюк с IF(false, , )! Я никогда не перестаю учиться у тебя - Спасибо, Эллиотт!

Mikhail Berlyant 18.12.2018 20:23

Другие вопросы по теме