PostgreSQL:如何将SELECT获取的序列名作为另一SELECT的表名?
PostgreSQL合并序列查询:获取序列名及last_value
你需要先获取指定表字段的序列名,再查询该序列的last_value,以下是可行的合并方法及对你尝试失败的分析:
需求拆解
- 获取序列名:
SELECT pg_get_serial_sequence('user', 'user_id'); -- 返回:public.user_id_seq
- 查询序列的
last_value:
SELECT last_value FROM public.user_id_seq;
正确合并查询方法
方法1:通过系统表关联查询
无需动态SQL,直接关联pg_sequence系统表获取结果:
SELECT pg_get_serial_sequence('user', 'user_id') AS sequence_name, s.last_value FROM pg_sequence s WHERE s.seqrelid = pg_get_serial_sequence('user', 'user_id')::regclass;
方法2:使用动态SQL(适合复杂场景)
如果需要动态执行查询,可结合LATERAL与动态SQL实现(PostgreSQL 11+支持):
WITH seq AS (SELECT pg_get_serial_sequence('user', 'user_id') AS seq_name) SELECT seq.seq_name, lv.last_value FROM seq, LATERAL (EXECUTE format('SELECT last_value FROM %I', seq.seq_name)) AS lv;
你尝试方法的问题分析
- 第一种CTE方法
WITH t AS ( SELECT pg_get_serial_sequence('user', 'user_id') ) SELECT * FROM t;
仅返回序列名字符串,未关联序列表查询last_value,无法得到目标结果。
- 第二种VALUES子句方法
WITH tableName AS ( VALUES ( pg_get_serial_sequence('user', 'user_id') ) ) SELECT * FROM tableName
同样只返回序列名字符串,未执行后续的序列查询逻辑。
- 第三种DO块+游标方法
do $$ declare _query text ; _cursor CONSTANT refcursor :='_cursor'; begin _query:=format('SELECT * FROM %s ', (SELECT pg_get_serial_sequence('user', 'user_id'))); open _cursor for execute _query; end; $$; fetch all from _cursor; -- cursor "_cursor" does not exist
DO块内定义的游标仅在块内部有效,块执行结束后游标会被销毁,外部无法访问;且DO块本身无法直接返回查询结果,不适合用来获取数据。
内容的提问来源于stack exchange,提问作者veva liu
相关产品推荐
相关产品推荐

