У меня есть таблица, которая выглядит так:
Row id edad nombre sector contacto.telefono contacto.correo
1 275 18 dozolme El Golf 5555555 [email protected]
123456789 [email protected]
35161631
Как я могу вернуться к этому?
Row id edad nombre sector telefono correo
1 275 18 dozolme El Golf 5555555 [email protected]
2 275 18 dozolme El Golf 123456789 [email protected]
3 275 18 dozolme El Golf 35161631 null --> ? maybe null?
Схема:
id INTEGER NULLABLE
edad INTEGER NULLABLE
nombre STRING NULLABLE
sector STRING NULLABLE
contacto RECORD REPEATED
contacto.telefono STRING REPEATED
contacto.correo STRING REPEATED
РЕДАКТИРОВАТЬ
Вот как я получаю результат сейчас


select * except(contacto, telefono, correo),
telefono, correo
from `project.dataset.table`,
unnest(contacto),
unnest(telefono) as telefono with offset
join unnest(correo) as correo with offset
using(offset)
я только что попробовал с образцами данных из вашего вопроса - и я не вижу пустых мест!!! - пожалуйста, перепроверьте и/или уточните свою проблему
Добавил фото с выводом запроса
попробуй обновлённую версию - я понял, что телефоно, коррео тоже повторяются, поэтому скорректировал код соответственно
СПАСИБО!! Это сработало! Можете ли вы объяснить мне немного, почему и как? Или укажите мне направление, где я могу узнать больше об этом. Иногда мне кажется, что я слаб в SQL.
конечно. так что сначала unnest просто сглаживает массив contacto. затем массивы telefono и correo также выравниваются, а их элементы соединяются на своих позициях в этих массивах. а затем - исходные массивы contacto, telefono, correo исключаются из вывода через except . надеюсь это поможет. рассмотрите возможность голосования за ответ
@PedroPabloSeverinHonorato . . . Я думаю, что это возвращает только минимальное количество телефонных номеров и электронных писем. Итак, если у вас есть 3 номера телефона и 2 адреса электронной почты, вы получите только 2 номера телефона с этим запросом.
Гордон прав. Каким-то образом я предположил, что телефон и электронная почта связаны друг с другом. Между тем, ответ Гордона вообще не работает и просто не работает!!! :о(
У вас очень странная структура данных — массив контактов с массивами адресов электронной почты и телефонных номеров. Слишком много повторяющихся полей.
select t.* except (contacto, telefono, correo),
te, co
from t left join
unnest(t.contacto) c
on 1=1 left join
(unnest(c.telefono) te with offset tn full join
unnest(c.correo) co with offset cn
on tn = cn
)
on 1=1;
Наверное, из-за отсутствия у меня опыта. Разве это не «правильный способ» хранения контактной информации человека? Телефон и электронная почта не должны быть в разделе «Контактная информация»?
@PedroPabloSeverinHonorato . . . Я сомневаюсь, что телефон и электронная почта связаны друг с другом. У вас должно быть только два массива, один для телефонных номеров и один для электронной почты — структура не требуется.
Ну... да... телефон и электронная почта не связаны друг с другом. Единственная связь состоит в том, что они принадлежат конкретному человеку, но не более того. Возможно, у меня неправильное представление о структурах и массивах. Не могли бы вы порекомендовать мне, где я могу узнать все это
Все еще получаю эти пустые места :(. Строка 1 не превращается в 3 разные строки