我有一个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
. . .
计算视图被调用的次数。 这可能是方便的信息。