给定步骤的当前时间交替的真/假标志

时间:2014-03-20 20:43:53

标签: sql postgresql auto-increment sql-insert

我每隔X毫秒执行一次查询。作为结果的一部分,我希望交替true/false标志。无论何时再次执行查询,此标志都应该更改。

实施例

示例查询:select 1, <<boolean alternator>>;

第一次执行返回:1 | true

第二次执行返回:1 | false

第3次执行返回:1 | true

等等。如果它第一次返回truefalse并不重要。

对于X是奇数秒的情况,我有以下解决方案:

select 
  mod(right(extract(epoch from current_timestamp)::int::varchar,1)::int, 2) = 0 
  as alternator

这将从纪元中提取最后一位数字,然后测试这是否为偶数。因为X被定义为奇数,所以此测试将从一个执行交替到另一个执行。

当X不同时,什么会以相同的方式工作 - 甚至是否在整秒内?我想让它适用于X,如500ms,1200ms,2000ms,......

注意:我打算在PostgreSQL中使用它。

3 个答案:

答案 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 DEFINERALTER 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