生成随机数字
生成 0 到 1 之间的随机数
SELECT random();
random |
------------------|
0.5573292311275964|
SELECT random();
random |
--------------------|
0.017827744704202786|
SELECT setseed(0);
SELECT random();
random |
------------------|
0.0000000000000391|
random |
------------------|
0.0009853946746503|
...
SELECT setseed(0);
SELECT random();
random |
------------------|
0.0000000000000391|
random |
------------------|
0.0009853946746503|
生成指定范围内的随机数
low + RANDOM() * (high - low)
SELECT 10 + random() * 10 AS rd;
rd |
------------------|
15.680596127871453|
SELECT floor(10 + random() * 10);
floor|
-----|
12.0|
生成 6 位数字手机验证码
SELECT to_char(random() * 1000000, '099999') AS captcha;
captcha|
-------|
076774|
生成遵循正态分布的随机数
CREATE EXTENSION tablefunc;
SELECT *
FROM normal_rand(10, 0, 1);
normal_rand |
--------------------|
0.0936639131151394|
-1.26936035550923|
2.006729235590952|
0.7869592803653096|
-1.5740650326039192|
-0.18656503408337746|
1.0665080022417979|
-1.1240167023021148|
1.1073155396442795|
0.09360901134478303|
SELECT count(*), avg(v), stddev(v)
FROM normal_rand(1000000, 0, 1) AS v;
count |avg |stddev |
-------|------------------|------------------|
1000000|0.0001662571158423|0.9992607627843408|
CREATE OR REPLACE FUNCTION normal_distrib(mean DOUBLE PRECISION, stdev DOUBLE PRECISION)
RETURNS DOUBLE PRECISION
LANGUAGE plpgsql
AS $$
DECLARE
x DOUBLE PRECISION;
y DOUBLE PRECISION;
rd DOUBLE PRECISION;
BEGIN
x := random();
y := random();
rd = (sqrt(-2 * ln(x)) * cos(2 * pi() * y)) * stdev + mean;
RETURN rd;
END $$;
SELECT normal_distrib(0,1);
normal_distrib |
-----------------|
0.404847649020953|
WITH RECURSIVE d(n, v) AS (
SELECT 1 AS n, normal_distrib(0, 1) AS v
UNION ALL
SELECT n+1, normal_distrib(0, 1) FROM d WHERE n<1000000
)
count |avg |stddev |
-------|---------------------|-----------------|
1000000|-0.001243494839949032|0.999320444731066|
生成随机字符串
生成固定长度的随机字符串
SELECT chr(floor(random() * 26)::integer + 65);
chr|
---|
V |
CREATE OR REPLACE FUNCTION random_string(
num INTEGER,
chars TEXT default '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
) RETURNS TEXT
LANGUAGE plpgsql
AS $$
DECLARE
res_str TEXT := '';
BEGIN
IF num < 1 THEN
RAISE EXCEPTION 'Invalid length';
END IF;
FOR __ IN 1..num LOOP
res_str := res_str || substr(chars, floor(random() * length(chars))::int + 1, 1);
END LOOP;
RETURN res_str;
END $$;
SELECT random_string(10);
random_string|
-------------|
etP3odkRgA |
SELECT random_string(6, '0123456789');
random_string|
-------------|
082661 |
生成可变长度的随机字符串
SELECT random_string(floor(10 + random() * 11)::int);
random_string |
----------------|
8tz5zHcbKVKoVg4S|
生成随机日期和时间
SELECT current_date + floor((random() * 15))::int rand_date;
rand_date |
----------|
2020-11-04|
SELECT make_time(floor((random() * 12))::int, floor((random() * 60))::int, floor((random() * 60))::int) AS rand_time;
rand_time|
---------|
10:04:52|
获取表中的随机记录
SELECT random() FROM employee;
random |
-------------------|
0.10449782906204419|
0.3345344734009643|
0.7295074473683592|
...
SELECT emp_id, emp_name
FROM employee
ORDER BY random()
LIMIT 5;
emp_id|emp_name |
------|---------|
2|关羽 |
9|赵云 |
13|关兴 |
25|孙乾 |
17|马岱 |
SELECT round(rand() * (SELECT max(emp_id) FROM employee)) AS id;
id |
----|
10.0|
SELECT e.emp_id, e.emp_name
FROM employee e
INNER JOIN (SELECT round(random() * (SELECT max(emp_id) FROM employee)) AS id
) AS t
ON e.emp_id >= t.id
LIMIT 1;
emp_id|emp_name|
------|--------|
10|廖化 |
SELECT emp_id, emp_name
FROM employee
TABLESAMPLE BERNOULLI (10);
emp_id|emp_name|
------|--------|
4|诸葛亮 |
13|关兴 |
生成 UUID
CREATE EXTENSION pgcrypto;
SELECT gen_random_uuid();
gen_random_uuid |
------------------------------------|
2d757cf5-c18c-469c-8b5e-eed914eacc93|
SELECT replace(gen_random_uuid()::text,'-','');
replace |
--------------------------------|
cabbfcdc62c54e2889bdd2b7095f1270|
总结
文章转载自SQL编程思想,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。