Sql 为什么where子句中的random()函数会导致查询返回多于或少于一行?

Sql 为什么where子句中的random()函数会导致查询返回多于或少于一行?,sql,postgresql-9.3,Sql,Postgresql 9.3,这个查询怎么可能返回多行?它如何返回零行 WITH cte(k,v) AS (VALUES (0,'A'), (1,'B'), (2,'C')) SELECT * FROM cte WHERE k=round(random()*2); 有时返回一行,有时返回两行,有时返回三行,有时返回无行。但是如果random()函数返回一个值,那么该值只能与表中的一行匹配,对吗?如果我将它乘以2并四舍五入为整数,那么返回值必须是0、1或2,因此必须正好匹配一行,对吗 如果我将random()调用放在子查询中

这个查询怎么可能返回多行?它如何返回零行

WITH cte(k,v) AS (VALUES (0,'A'), (1,'B'), (2,'C'))
SELECT * FROM cte WHERE k=round(random()*2);
有时返回一行,有时返回两行,有时返回三行,有时返回无行。但是如果
random()
函数返回一个值,那么该值只能与表中的一行匹配,对吗?如果我将它乘以
2
并四舍五入为整数,那么返回值必须是
0
1
2
,因此必须正好匹配一行,对吗

如果我将
random()
调用放在子查询中,如下所示:

WITH cte(k,v) AS (VALUES (0,'A'), (1,'B'), (2,'C'))
SELECT * FROM cte WHERE k=(select round(random()*2));
然后它只返回一行,就像我在没有子查询的情况下所期望的那样

以及查询

SELECT round(random()*2);
仅返回一行,其中一列的值为
0
1
2
,因此我不理解如何匹配
cte
表中的一行以外的任何内容。然而,在上面的第一个查询中,有时它似乎与多行或少行匹配。这里发生了什么?

大概是为源数据中的每一行调用了
random()
,而不是像您假设的那样只调用一次


因此,源数据中的每一行都有33%的几率被返回

如其他人所述,为每一行调用
random()

如果需要单个随机行,可以使用
orderbyrandom()
子句,然后
将结果限制为单个行,类似这样(未测试):

带cte(k,v)AS(值(0,'A'),(1,'B'),(2,'C'))
从cte ORDER BY random()中选择*限制1