CREATE OR REPLACE FUNCTION random_choice(
choices text[]
)
RETURNS text AS $$
DECLARE
size_ int;
BEGIN
size_ = array_length(choices, 1);
RETURN (choices)[floor(random()*size_)+1];
END
$$ LANGUAGE plpgsql;
使用示例:
SELECT random_choice(array['h', 'i', 'j', 'k', 'l']) as random_char;
SELECT random_choice((SELECT array_agg(name) FROM pets)) AS pet_name;
好主意。我建议做两个小的简化:
使用数组字面量(
'{Foo,Bar,Poo}'::text[]
) 的更简单语法 为更长的列表缩短字符串。额外的好处:显式类型声明适用于任何类型,而不仅仅是text
. 您最初的想法恰好是 outputtext
,因为这是字符串文字的默认类型。使用
ceil()
而不是floor() + 1
. 结果相同。好的,从理论上讲,正如您的评论中所暗示的那样,下限可以精确地为 0 ,因为
random()
产生(在此处引用手册):但是,我从未见过这种情况发生。运行几百万次测试:
-> SQL小提琴
不过,为了绝对安全,您可以使用 Postgres 自定义数组下标,并且仍然避免额外添加:
看:
更好的是,使用
trunc()
,这有点快。我想出了使用数组来完成此任务的想法:
基于这个想法,我创建了一个对我非常有用的函数:
使用示例:
SELECT random_choice(array['h', 'i', 'j', 'k', 'l']) as random_char;
SELECT random_choice((SELECT array_agg(name) FROM pets)) AS pet_name;