当数据不是完整序列时使用Oracle序列

时间:2018-12-03 10:24:22

标签: sql oracle sequence

给出一个包含唯一序列作为主键和附加值VAL的数据库表;

enter image description here

我需要检索与“%b”类似的值,但我需要按顺序一次检索一个。如果值是连续的,我将使用Oracle序列使用nextval,currval等通过PKEY进行工作。

这里的问题是,如果序列为4,而我去执行nextval,它将给我一个不正确的值(%a值而不是%b值)。

我能想到的一种解决方案是使用带有“大于”而不是“等于”的序列,例如(请使用伪代码,稍后我可以算出正确的语法);

select pkey, val from table where val like '%b' and pkey>seq.currval

然后将序列移到pkey的值之后(为了清楚起见,再次使用伪代码);

alter sequence seq set currval=pkey

在某些情况下,作为性能测试的一部分,许多虚拟用户将访问此表,他们每个人都需要能够运行查询以获取唯一的值(因此,vuser 1获得58b,vuser2获得24b等)。无法预先订购或过滤数据。

2 个答案:

答案 0 :(得分:0)

您是否只想计算以b结尾的值?

select pkey, val,
       (case when val like '%b'
             then row_number() over (partition by (case when val like '%b' then 1 else 0 end) order by pkey
                                    )
        end) as b_seq
from table;

如果要查找与b_seq的特定行相对应的行,可以将其用作子查询。

如果您不关心其他值,则可以使用where子句来编写:

select pkey, val,
       row_number() over (order by pkey) as b_seq
from table
where val like '%b';

答案 1 :(得分:0)

我将以戈登的答案为基础:

with
x as (
  select seq.nextval as s
),
y as (
  select pkey, val,
       row_number() over (order by pkey) as b_seq
  from table
  where val like '%b'
)
select y.* from y join x on y.b_seq = x.s

这样,每个请求都将增加序列,并从“ b子集”返回不同的SINGLE值。