给出一个包含唯一序列作为主键和附加值VAL的数据库表;
我需要检索与“%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等)。无法预先订购或过滤数据。
答案 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值。