PostgresQL - 为 SELECT 查询定义 SEQUENCE



我有一个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应该从指定的值开始。

这是一个数据库<>小提琴。

我应该指出,这确实表明数据库设计存在问题。 但是,我可以想象一个包含以下内容的视图:

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

计算视图被调用的次数。 这可能是方便的信息。

最新更新