Oracle如何实现从特定组合中随机读取值

在这里,我们会用到DBMS_RANDOM包和CASE WHEN语句,思路如下:

一、利用DBMS_RANDOM.RANDOM函数随机生成数值,然后对数值进行取模,如果我们要在10个元素中随机读取的话,那我们需要对10进行取模。

二、再将取模后的值利用CASE WHEN语句与元素进行关联。

譬如,我有一个组合,里面包含“北京”,“上海”,“广州”,“深圳”,“武汉”五个元素,想从这五个元素中随机读取值来填充表的某个字段。

首先,创建测试表

SQL> create table test(loc varchar2(2 char));

Table created.

构造能随机读取元素的SQL语句

select case mod(abs(dbms_random.random),5)
       when 1 then ‘北京‘
       when 2 then ‘上海‘
       when 3 then ‘广州‘
       when 4 then ‘深圳‘
       else ‘武汉‘ end "LOC"
from dual;

大批量填充test表的loc字段

begin
  for i in 1..10 loop
     insert into test values(case mod(abs(dbms_random.random),5)
          when 1 then ‘北京‘
          when 2 then ‘上海‘
          when 3 then ‘广州‘
          when 4 then ‘深圳‘
          else ‘武汉‘ end );
  end loop;
end;

最后生成的结果如下:

SQL> select * from test;

LOC
--------
武汉
广州
上海
北京
上海
武汉
北京
上海
武汉
深圳

10 rows selected.
时间: 2024-08-07 06:34:13

Oracle如何实现从特定组合中随机读取值的相关文章

Jmeter中随机读取测试文件的内容

性能测试中需要测试这么一个场景:测试数据是一堆的地址,存储在一个文件中.为了模仿真实的用户访问场景,需要从这个文件中每次随机选取地址,拼接在一个固定的域名后发送出去.看了半天jmeter的帮助文档,也在网上搜了半天,用jmeter的Groovy脚本解决: import java.text.*;import java.io.*;import java.util.*; String csvTest = "test_data.csv";//csvDir = vars.get("fi

找出数组中所有组合中最大的值

面试中,经常有算法题: 比如找出一个数组中的所有组合,并找出最大的值. 代码如下: 1 package com.company.algorithm; 2 3 /** 4 * 选择数组中和的值最大的一组,例如:[2,-7,5,-9],组大的一组是:2,-7,5值为0 5 */ 6 public class SelectValueMaxGroup { 7 public static void main(String[] args) { 8 int[] list = {6, -1, 2, -9, 4,

MYSQL 中随机读取一条数据

SELECT * FROM res AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM res) - (SELECT MIN(id) FROM res)) + (SELECT MIN(id) FROM res)) AS id) AS t2 WHERE t1.id >= t2.id ORDER BY t1.id LIMIT 1; select * FROM `res` AS t1 JOIN(SELECT ROUND(RAND()*((SE

从一个数组中随机的取出若干个不同的数

/* * 此程序是从一个不重复的数组中随机的取出若干个不同的元素 * 难点是防止在取数的时候出现已经取到过的情况(特别是取到最后),需要尽可能的降低碰撞 */ //第一种算法,CSDN上别人的想法 /* $num = 0; $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9); $arr = array(); $g = 5; $tag = true; while ($tag) { $count = count($array); $t = rand(0, 1); if

SQL: 从一个表随机读取一行或几行记录的问题

比如ms sql 2000,随机读取了一行记录: SELECT TOP 1 * FROM [tablename] ORDER BY NEWID() 遇到的问题是,如果这个表记录不多,比如几十或几百.几千行记录,基本上不用1秒时间就出来了. 但我今天需要从一个几十万行记录的表中随机读取一条记录,读取一次需要3 - 5秒. 这效率有点接受不了. 到网上也搜索了一下,有没有更好的办法,没找到好的办法. 关于这个问题的讨论,CSDN: http://topic.csdn.net/u/20100517/1

Oracle中随机抽取N条记录

一.Oracle取随机数据  1.Oracle访问数据的基本方法:  1).全表扫描(Full table Scan):执行全表扫描,Oracle读表中的所有记录,考查每一行是否满足WHERE条件.Oracle顺序的读分配给该表的每一个数据块,且每个数据块Oracle只读一次.这样全表扫描能够受益于多块读. 2).采样表扫描(sample table scan):扫描返回表中随机采样数据,这种访问方式需要在FROM语句中包含SAMPLE选项或者SAMPLE BLOCK选项.     注:从Ora

【转】oracle 中随机取数据的方法

oracle 中随机取数据的方法: 1.快速随机取数据(推荐使用): select * from MEMBER sample(1) where rownum <= 10 2.随机取数据,较慢 select * from (  select * from MEMBER order by dbms_random.value) where rownum<=10 ========原文======== 最近在做系统时用到了随机抽取记录的问题: 上网上查找了很多相关资料,发现了不同的方法及其差异.都是基于

【转】oracle 中随机取一条记录的两种方法

oracle 中随机取一条记录的两种方法 V_COUNT INT:=0; V_NUM INT :=0; 1:TBL_MYTABLE 表中要有一个值连续且唯一的列FID BEGIN SELECT COUNT(*) INTO V_COUNT FROM  TBL_MYTABLE; SELECT TRUNC(DBMS_RADOM.VALUE(1,V_COUNT+1)) INTO V_NUM FROM DUAL; SELECT * FROM TBL_MYTABLE T WHERE T.FID=V_NUM;

排列组合(包括n中随机抽取m个)

有些情况我们需要获取一个数组中的所有排列组合情况,或者获取一部分数据进行随机组合,这个在python中有一个模块可以实现.具体情况如下 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: permutations()可以用来生成排列组合的所有样式参数可以有一个也可以有两个,一个list输出排列组合,两个参数[list,n]表示从list中随机选出n个元素的所有情况 实例: print(list(