【问题标题】:Oracle rand() functionOracle rand() 函数
【发布时间】:2014-12-13 07:44:09
【问题描述】:

我尝试使用查询 rand() 从表雇员中选择一个随机数据,但它可能会发生

SELECT email FROM employees
ORDER BY RAND()
LIMIT 1;

输出是:

ORA-00933:SQL 命令未正确结束
00933. 00000 - “SQL 命令未正确结束”

谁能告诉我为什么?

【问题讨论】:

  • 能否提供数据库的架构?
  • Oracle 中既没有LIMIT,也没有rand() 函数。请阅读说明书

标签: sql oracle random


【解决方案1】:

rand() 的 Oracle 等效项是 dbms_random.value。

limit 的 Oracle 等效项是带有 rownum 或(在 Oracle 12 中)fetch first xx row only 的子查询。因此,其中之一应该可以工作:

select email
from employees
order by dbms_random.value
fetch first 1 row only;

或:

select email
from (select email
      from employees
      order by dbms_random.value
     ) e
where rownum = 1

【讨论】:

  • 嗨@Gordon,虽然已经有几年了:(。只是想说谢谢你回答这个问题:)
【解决方案2】:

为了加快对大表的操作,您可以使用SAMPLE 子句从您的表中随机抽取一个数据样本,然后从该样本中随机抽取一个数据:

select email from 
( SELECT email,ROWNUM rn
  FROM employees SAMPLE(5)
  --                    ^
  --      each row has 5% chance of being picked-up
  --      adjust that depending your table size and/or your needs
  ORDER BY dbms_random.value)
where rn = 1;

另一个想法是,您不需要完整的排序来提取 一个 随机行。例如,您可能想尝试另一种方法:

with cte as (
    SELECT email, ROWNUM rn
    FROM employees
  ),
  rnd as (
    SELECT TRUNC(DBMS_RANDOM.VALUE(1, (SELECT COUNT(*) FROM CTE))) AS value FROM DUAL
  )

SELECT cte.email FROM cte JOIN rnd
    ON cte.rn = rnd.value;

我不知道 Oracle 是否能够“正确”优化此类查询。

【讨论】:

  • 感谢提及sample。
【解决方案3】:

Oracle 没有限制。你可以试试这个:

select email from 
(SELECT email, row_number() over(order by dbms_random.value) rw FROM employees)
where rw = 1;

【讨论】:

  • @alvin 如果这对您有帮助,请vote up and/or accept the answer。这是在 SO 上说“谢谢”的主要方式。此外,这将帮助人们从互联网上找到这个问题,以了解哪个答案解决了您的问题。
  • 嗨@Multisync,虽然已经有几年了:(。只是想说谢谢你回答我的问题。感谢Sylvain提到我:)
【解决方案4】:
SELECT 
(DBMS_RANDOM.VALUE( 0, 1 )) as RND,
....
....
....

From (your_table)

Order by RND

【讨论】:

  • 虽然这可能会回答问题,但您应该添加一些评论来解释其工作原理。
猜你喜欢
  • 2012-11-08
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 2021-02-14
  • 2012-10-18
  • 2016-11-19
相关资源
最近更新 更多