【问题标题】:Creating temporary table dynamic with loop for in PostgreSQL在 PostgreSQL 中使用循环创建动态临时表
【发布时间】:2021-09-08 15:51:04
【问题描述】:

我正在 postgresql 中编写一个脚本来创建动态临时表,包括表的名称和条件 where a.state =。下面的查询实现了这个目标,因为它替换了查询中声明的变量 level 的字符串 ('ACTIVE'),该变量用 begin 初始化。

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 循环来遍历 array ['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$$

错误:“级别”或附近的语法错误第 8 行:for i 在级别 ^ SQL 状态:42601 字符:230

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

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');

【问题讨论】:

    标签: sql arrays database postgresql plpgsql


    【解决方案1】:

    您需要在循环中遍历数组:

    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

    【讨论】:

    猜你喜欢
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 2019-10-11
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多