Удаление нескольких таблиц в одной БД — начинается с того же префикса — Большой запрос

#google-bigquery

#google-bigquery

Вопрос:

Как я могу удалить несколько таблиц в одной базе данных, которая начинается с одного и того же префикса?

Пример:

Запрос на удаление 1 таблицы

 drop table project_id.db.test_table_<some_random_string>
  

Но как я могу удалить все таблицы, которые начинаются с одного и того же префикса test_table_ в одной и той же БД?

Ответ №1:

Возможный обходной путь был бы. (задан регион eu)

 BEGIN
DECLARE drop_statments ARRAY<string>;
DECLARE len int64 default 1;

SET drop_statments = (SELECT ARRAY_AGG( 'drop table ' || table_schema ||'.' || table_name)
                      FROM `region-eu.INFORMATION_SCHEMA.TABLES`
                        WHERE table_schema = 'db' and table_name like 'Table_Prefix%'
                    );


WHILE ARRAY_LENGTH(drop_statments) >= len DO
    EXECUTE IMMEDIATE  drop_statments[offset(len-1)];
    SET len = len  1;
END WHILE ;

END;
  

Вы можете использовать любой из приведенных ниже наборов данных INFORMATION_SCHEMA.

 -- Returns metadata for tables in a single dataset.
SELECT * FROM myDataset.INFORMATION_SCHEMA.TABLES;

-- Returns metadata for tables in a region.
SELECT * FROM region-us.INFORMATION_SCHEMA.TABLES;
  

Комментарии:

1. Спасибо @narendra! Замена region-us на db сработала для меня как по волшебству! Приветствия!

2. Рад это слышать .. Ура!

Ответ №2:

Аналогично narendra @ solution, но с использованием FOR..IN :

 FOR drop_statement IN 
  (SELECT CONCAT("drop table ",table_schema,".",   table_name, ";" ) AS value
      FROM dataset.INFORMATION_SCHEMA.TABLES -- or region.INFORMATION_SCHEMA.TABLES
      WHERE table_name LIKE "table_prefix%"
      ORDER BY table_name DESC)
DO
  EXECUTE IMMEDIATE(drop_statement.value); -- Here the table is dropped
END FOR;
  

Также стоит упомянуть, что вы можете изменить «таблица» на «просмотр» также в зависимости от информации, возвращаемой из представлений INFORMATION_SCHEMA.