#sql #google-bigquery
#sql #google-bigquery
Вопрос:
Я сталкиваюсь с большой таблицей с данными, которые были импортированы из csv. Однако разделители в csv не были очищены, поэтому входные данные выглядели примерно так:
alex@mail.com:Alex
dummy@mail.com;Bob
foo@bar.com:Foo
spam@yahoo.com;Spam
whatever@mail.com:Whatever
Во время импорта: был определен как разделитель, поэтому каждая строка с разделителем ; не была импортирована должным образом. В результате получилась таблица, структурированная следующим образом:
| ID | MAIL | USER |
|-- --|---------------------|----------|
| 1 | alex@mail.com | ALEX |
| 2 | dummy@mail.com;Bob | NULL |
| 3 | foo@bar.com | Foo |
| 4 | spam@yahoo.com;Spam | NULL |
| 5 | whatever@mail.com | Whatever |
Поскольку повторный перенос невозможен, я думал о ручной очистке данных в затронутых строках с помощью запросов SQL. Итак, я попытался объединить инструкции SELECT и UPDATE путем фильтрации строк, ГДЕ USER РАВЕН NULL, и обновить оба столбца правильным значением, где это применимо.
Комментарии:
1. Привет @ Es Ka спасибо за ваш вопрос, не могли бы вы, пожалуйста, предоставить пример кода, который вы использовали, и объяснить, что не работает (Примечание: ваш общий подход хорош, и этого определенно можно достичь с помощью SQL-запроса)
Ответ №1:
Что вам нужно, так это строковые функции. Немного почитав, я обнаружил, что в Google BigQuery есть STRPOS() и SUBSTR().
https://cloud.google.com/bigquery/docs/reference/standard-sql/string_functions#substr
https://cloud.google.com/bigquery/docs/reference/standard-sql/string_functions#strpos
Запрос на обновление для исправления описываемой вами ситуации выглядит следующим образом:
update table_name set mail =SUBSTR(mail,1,STRPOS(mail,';')-1), user =SUBSTR(mail,STRPOS(mail,';') 1) where user is null
Идея здесь состоит в том, чтобы разделить почту на две части, часть до ; и часть после. Надеюсь, это поможет.