postgresql:如何从 table 的非后续 ID 中获取现有 ID
postgresql: How to grab an existing id from a not subsequent ids of a table
Postgresql 版本 9.4
我有一个带有整数列的 table,它有许多整数,但有一些间隔,如下面的示例;我正在尝试使用以下查询随机从列中获取现有 ID,但它偶尔会 returns NULL:
CREATE TABLE
IF NOT EXISTS test_tbl(
id INTEGER);
INSERT INTO test_tbl
VALUES (10),
(13),
(14),
(16),
(18),
(20);
-------------------------------
SELECT * FROM test_tbl;
-------------------------------
SELECT COALESCE(tmp.id, 20) AS classification_id
FROM (
SELECT tt.id,
row_number() over(
ORDER BY tt.id) AS row_num
FROM test_tbl tt
) tmp
WHERE tmp.row_num =floor(random() * 10);
请让我知道哪里做错了。
您可以 select 一行并按 random()
排序,这样您就可以确保找到现有的行
select id
from test_tbl
order by random()
LIMIT 1;
but it returns NULL occasionally
我必须补充一点,它有时 return 超过 1 行,对吧?
在您的示例数据中有 6 行,因此 row_num
列的值将从 1 到 6。
这个:
floor(random() * 10)
创建一个从 0 到 0.9999 的随机数...
你应该使用:
floor(random() * 6 + 1)::int
获取 1 到 6 之间的随机整数。
但这并不能解决问题,因为WHERE子句对每一行执行一次,所以有一种情况row_num
永远不会匹配到创建的随机数,所以会return nothing,否则它将匹配不止一次,因此它将 return 超过 1 行 .
参见 demo.
获取随机行的正确(尽管有时不是最有效的)方法是:
SELECT id FROM test_tbl ORDER BY random() LIMIT 1
同时检查来自 SO 的其他链接,例如:
quick random row selection in Postgres
Postgresql 版本 9.4
我有一个带有整数列的 table,它有许多整数,但有一些间隔,如下面的示例;我正在尝试使用以下查询随机从列中获取现有 ID,但它偶尔会 returns NULL:
CREATE TABLE
IF NOT EXISTS test_tbl(
id INTEGER);
INSERT INTO test_tbl
VALUES (10),
(13),
(14),
(16),
(18),
(20);
-------------------------------
SELECT * FROM test_tbl;
-------------------------------
SELECT COALESCE(tmp.id, 20) AS classification_id
FROM (
SELECT tt.id,
row_number() over(
ORDER BY tt.id) AS row_num
FROM test_tbl tt
) tmp
WHERE tmp.row_num =floor(random() * 10);
请让我知道哪里做错了。
您可以 select 一行并按 random()
排序,这样您就可以确保找到现有的行
select id
from test_tbl
order by random()
LIMIT 1;
but it returns NULL occasionally
我必须补充一点,它有时 return 超过 1 行,对吧?
在您的示例数据中有 6 行,因此 row_num
列的值将从 1 到 6。
这个:
floor(random() * 10)
创建一个从 0 到 0.9999 的随机数...
你应该使用:
floor(random() * 6 + 1)::int
获取 1 到 6 之间的随机整数。
但这并不能解决问题,因为WHERE子句对每一行执行一次,所以有一种情况row_num
永远不会匹配到创建的随机数,所以会return nothing,否则它将匹配不止一次,因此它将 return 超过 1 行 .
参见 demo.
获取随机行的正确(尽管有时不是最有效的)方法是:
SELECT id FROM test_tbl ORDER BY random() LIMIT 1
同时检查来自 SO 的其他链接,例如: quick random row selection in Postgres