我每隔X毫秒执行一次查询。作为结果的一部分,我希望交替true/false
标志。无论何时再次执行查询,此标志都应该更改。
实施例
示例查询:select 1, <<boolean alternator>>;
第一次执行返回:1 | true
第二次执行返回:1 | false
第3次执行返回:1 | true
等等。如果它第一次返回true
或false
并不重要。
对于X是奇数秒的情况,我有以下解决方案:
select
mod(right(extract(epoch from current_timestamp)::int::varchar,1)::int, 2) = 0
as alternator
这将从纪元中提取最后一位数字,然后测试这是否为偶数。因为X被定义为奇数,所以此测试将从一个执行交替到另一个执行。
当X不同时,什么会以相同的方式工作 - 甚至是否在整秒内?我想让它适用于X,如500ms,1200ms,2000ms,......
注意:我打算在PostgreSQL中使用它。
答案 0 :(得分:2)
我建议专注SEQUENCE
。
CREATE SEQUENCE tf_seq MINVALUE 0 MAXVALUE 1 START 0 CYCLE;
nextval()
的每次通话都会返回0/1。你可以强制转换为布尔值:
0::bool = FALSE
1::bool = TRUE
所以:
SELECT nextval('tf_seq'::regclass)::int::bool;
仅保持其他角色不会干扰序列的状态
GRANT USAGE ON SEQUENCE tf_seq TO $dedicated_role;
。将您的查询作为该角色运行,或使用SECURITY DEFINER
和ALTER FUNCTION foo() OWNER TO $dedicated_role
;
或者,更简单,只需将其设为列默认,并在插入中完全忽略它:
ALTER TABLE foo ALTER COLUMN bool_col
SET DEFAULT nextval('tf_seq'::regclass)::int::bool;
您需要将序列上的USAGE
授予可插入的角色
每一行都会自动获得翻转值。
The usual notes for sequences apply。就像,如果您回滚INSERT
,序列将保持翻转状态。序列状态永远不会回滚。
答案 1 :(得分:1)
临时表可以保存布尔状态:
create temporary table t (b boolean);
insert into t (b) values (true);
with u as (
update t
set b = not b
returning b
)
select 1, b
from t;
答案 2 :(得分:0)
我会用pltcl函数做同样的事情(boolean翻转而不是b)。
优点:变量缓存在会话tcl解释器中。缺点:任何pl ???函数有一个调用开销。
测试表,插入一些值:
strobel=# create table test (i integer);
CREATE TABLE
strobel=# insert into test (select * from generate_series(1, 10));
INSERT 0 10
功能:
create or replace function flipper () returns boolean as $$
if {![info exists ::flag]} {set ::flag false}
return [set ::flag [expr {! $::flag}]]
$$ language pltcl volatile;
测试:
strobel=# select *, flipper() from test;
i | flipper
----+---------
1 | t
2 | f
3 | t
4 | f
5 | t