在 PostgreSQL 中使用循环创建临时 table 动态

Creating temporary table dynamic with loop for in PostgreSQL

我正在 postgresql 中编写一个脚本,用于创建动态临时 tables,用于 table 的名称和条件 where a.state =。下面的查询实现了这个 objective,因为它替换了查询中用 begin.[= 初始化的变量声明级别的字符串 ('ACTIVE') 16=]

DO $$
declare 
   level varchar := 'ACTIVE';
BEGIN
 execute('drop table if exists con_users_'|| level ||
'; create temp table con_users_'|| level ||' AS (
SELECT * FROM usuario a WHERE a.state = '''|| level  ||''')');
END$$

但是,当我想添加for循环遍历一个数组['ACTIVE','OFF']以便独立执行时,问题就出现了这两个条件都在变量级别。向前推进:

      DO $$
      declare 
      i  varchar[];
      level varchar[] := array['ACTIVE','OFF'];   

       begin
         for i  in  level

         loop

   execute('drop table if exists con_users_'|| level ||
   '; create temp table con_users_'|| level ||' AS (
   SELECT * FROM users a WHERE a.state = '''|| level  ||''')');

        end loop;

 END$$

ERROR: syntax error at or near "level" LINE 8: for i in level ^ SQL state: 42601 Character: 230

我的目标是通过执行脚本,根据 array ['ACTIVE', 'OFF'] 的列表创建两个具有名称和 where 条件的临时 table。我需要此代码来开发更复杂的数据库,但如果它与此示例库一起使用就足够了

CREATE TABLE IF NOT EXISTS users
(
    users_id serial primary key,
    users    varchar(50),
    state    varchar(7)
);

INSERT INTO users(users_id, users, state)
VALUES (1, 'Peter', 'ACTIVE'),
       (2, 'Gerard', 'OFF'),
       (3, 'Juna', 'ACTIVE');

您需要在循环中迭代数组:

DO $$
DECLARE
  i  varchar[];
  level varchar[] := array['ACTIVE','OFF'];   

BEGIN
 FOR i IN 1..array_length(level,1) LOOP
  EXECUTE('drop table if exists con_users_'|| level[i] ||
          '; create temp table con_users_'|| level[i] ||' AS (
          SELECT * FROM users a WHERE a.state = '''|| level[i]  ||''')');

 END LOOP;
END$$

演示:db<>fiddle