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