PostgresQL - 为 SELECT 查询定义 SEQUENCE

PostgresQL - define SEQUENCE for a SELECT query

我有一个 VIEW,我为此使用了某个 SELECT 语句,其中有一个 CASE 条件,根据某些条件为 TRUE 或 FALSE 决定,是否增加计数器或使用当前值。

据我所知,SELECT 语句的任何视图在每次被引用时都会生成,因此每次发生时我都想重新创建 SEQUENCE

示例:

CREATE TABLE num(
n BIGINT PRIMARY KEY
);

INSERT INTO num(n) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9);

CREATE TEMP SEQUENCE seq START 1;
SELECT nextval('seq');

SELECT 
CASE WHEN n % 2 = 0 THEN nextval('seq')
     ELSE currval('seq')
END AS test,
n
FROM num;

我必须在 SELECT 语句之前插入 SELECT nextval('seq'),否则会产生

ERROR:  currval of sequence "seq" is not yet defined in this session

最终,这段代码不会每次都重新创建 SEQUENCE,因为它只会使用创建的值来生成新值。

这段代码按预期工作,但从我这边闻起来像糟糕的数据库设计。

你们有谁知道,如何在每次调用 SELECT 时创建一个新的 SEQUENCE 对象?或者还有其他方法吗?我觉得应该有一种简洁明了的方式来做到这一点,我肯定错过了一些东西!

对于您的示例,您可以在 SELECT:

中设置序列的值
SELECT (CASE WHEN n % 2 = 0 THEN nextval('seq')
             ELSE currval('seq')
        END) AS test,
       n
FROM num CROSS JOIN
     (SELECT setval('seq', 1)) s;

FROM 子句应在外部 SELECT 之前计算,因此外部 SELECT 应从指定值开始。

Here 是一个 db<>fiddle.

我应该注意到,这确实表明数据库设计存在问题。但是,我可以想象一个视图包含:

FROM (SELECT NEXT_VALUE('view_cnt')) x CROSS JOIN
     . . .

统计视图被调用的次数。这可能是有用的信息。