Условное обновление столбца B с измененным значением на основе столбца A

#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
  

Идея здесь состоит в том, чтобы разделить почту на две части, часть до ; и часть после. Надеюсь, это поможет.