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