【问题标题】:Truncate integer to specific number of digits?将整数截断为特定位数?
【发布时间】:2017-11-29 15:26:48
【问题描述】:

我们想要一个 SQL(不是 PL/pgSQL)函数,它给定一个任意大小的随机正整数,返回一个介于 0 和 999999 之间的整数。返回值应尽可能保留参数的随机性。

【问题讨论】:

  • 如果你将 42 传递给函数两次,它是否应该两次返回相同的值?如果你传 42,我传 42,我们应该得到相同的值吗?

标签: sql postgresql integer truncate


【解决方案1】:

在 PostgresSQL 中:

set seed 为下次调用 random 函数设置随机数:

setseed (arg)

此语句将生成 [0:999999] 范围内的数字

SELECT floor(random()*(999999-0+1))+10;

在 Python 中:

import random
def get_rand_int(arg)
    random.seed(arg)
    return random.randrange(0,100000)

使用随机时的注意事项

“Mersenne Twister 是现有测试最广泛的随机数生成器之一。但是,由于完全确定性,它并不适合所有用途,并且完全不适合加密用途。” https://docs.python.org/3/library/random.html?highlight=random#random.random

在 SQL 中:

这将使用 [seed] 作为种子值返回 999999 和 0 之间的下限整数。

SELECT FLOOR(RAND([seed])*(999999-0)); 

【讨论】:

  • 不错!现在,你能在 SQL 中给出这个问题的答案吗?
  • 抱歉,没注意标签,希望对你有用。
  • @J.Clark:PostgreSQL 没有名为 rand() 的函数。它拥有的函数不带参数。也许是时候关注标签了。
  • @MikeSherrill'CatRecall' 问题是“我们想要一个 SQL(不是 PL/pgSQL)函数......”
  • @J.Clark:标签包括“postgresql”,不是 Python,不是“tsql”,也不是“sql-server”。 PL/pgSQL 是 PostgreSQL 的过程语言,而不是 PostgreSQL 的 SQL 方言。您的 SQL 语句不会在 any 标准 SQL dbms 上运行;它会在 PostgreSQL 上抛出多个语法错误。
猜你喜欢
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多