在 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
我正在 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