我正在重组和统一 PostgreSQL 中的大型数据库。其中一部分是根据它们在“键”中的值将一些大表拆分为较小的表。我为此编写的函数运行良好,如下所示:
CREATE OR REPLACE FUNCTION split_tables (table_string varchar(100)) RETURNS void AS
$$
DECLARE
r_row record;
BEGIN
FOR r_row IN SELECT type FROM type_list
LOOP
EXECUTE 'CREATE TABLE public.id_' || table_string || '__' || r_row.type || ' AS (SELECT * FROM id_'
|| table_string || ' WHERE lower(id_' || table_string || '.key) = lower(''' || r_row.type || '''));';
END LOOP;
END;
$$
LANGUAGE plpsql;
因此,这将遍历 type_list 中的所有条目并为每种类型创建表。要对所有需要拆分的表执行此操作,我将此函数称为
SELECT tobesplit.id FROM tobesplit, LATERAL split_tables(tobseplit.id);
但是,这会为 type_list 中的所有条目创建表,即使表中没有要为某些类型拆分的条目。所以最后,我创建了一大堆我不需要的空表。我寻找了仅在结果不为空时才创建表的方法,并在以下答案中找到了可能的解决方案:CREATE TABLE IF ONLY NOT EMPTY RESULT SET。
如果我单独测试它,这会起作用,但我不知道如何将它合并到执行语句中。一旦我将 IF 或 CASE 子句写入 EXECUTE 语句,我总是会遇到语法错误。
我很感谢任何想法:)