You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle中基于筛选记录数生成不重复随机整数的技术咨询

Oracle中为筛选后记录生成不重复随机整数的实现方法

要实现为筛选后的记录生成指定范围的不重复随机整数,不能直接使用DBMS_RANDOM.VALUE()(该函数会产生重复值),正确的做法是先对筛选结果做随机排序,再通过行号函数生成连续不重复的整数。

实现代码

with all_val as (    
select 1 as ID, 'A' as val from dual  union all 
select 2 as ID, 'A' as val from dual  union all 
select 3 as ID, 'A' as val from dual  union all  
select 4 as ID, 'B' as val from dual  union all 
select 5 as ID, 'B' as val from dual  union all  
select 6 as ID, 'B' as val from dual  union all 
select 7 as ID, 'A' as val from dual  union all 
select 8 as ID, 'A' as val from dual  union all 
select 9 as ID, 'A' as val from dual)
select A.*,
       ROW_NUMBER() OVER(ORDER BY DBMS_RANDOM.VALUE()) as RND
from (
    select B.* from all_val B
    where VAL <> 'B'
) A;

原理说明

  1. 子查询A先筛选出VAL <> 'B'的6条记录;
  2. 通过ROW_NUMBER() OVER(ORDER BY DBMS_RANDOM.VALUE()),以随机生成的值为排序依据,对筛选结果进行随机打乱;
  3. ROW_NUMBER()会为打乱后的每条记录分配一个从1开始的连续整数,最终得到1-6范围内的不重复随机数。

如果需要生成0-5范围的不重复随机数,只需将行号结果减1:

ROW_NUMBER() OVER(ORDER BY DBMS_RANDOM.VALUE()) - 1 as RND

内容的提问来源于stack exchange,提问作者Lawrence Block

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 00:22:14