Postgresql Postgres-Case When语句中的返回函数
嘿,我想创建一个随机数。当这个随机数已经存在时,我想一次又一次地调用随机数函数。在这种情况下,我需要在case-WHEN语句中返回randomnumber函数。 它不起作用。仍然获取错误,该号码已存在。我想为唯一列创建一个随机数:Postgresql Postgres-Case When语句中的返回函数,postgresql,function,random,Postgresql,Function,Random,嘿,我想创建一个随机数。当这个随机数已经存在时,我想一次又一次地调用随机数函数。在这种情况下,我需要在case-WHEN语句中返回randomnumber函数。 它不起作用。仍然获取错误,该号码已存在。我想为唯一列创建一个随机数: CREATE OR REPLACE FUNCTION getrandomnumber(integer, integer) RETURNS integer AS $BODY$ DECLARE sta
CREATE OR REPLACE FUNCTION getrandomnumber(integer, integer)
RETURNS integer AS
$BODY$
DECLARE
start_int ALIAS FOR $1;
end_int ALIAS FOR $2;
name int;
BEGIN
name = trunc(random() * (end_int-start_int) + start_int);
CASE WHEN (select count(alias) from drivers where alias = name limit 1) = 0
THEN RETURN name;
ELSE RETURN getrandomnumber(start_int, end_int);
END CASE;
END;
$BODY$
LANGUAGE plpgsql VOLATILE STRICT
COST 100;
ALTER FUNCTION getrandomnumber(integer, integer)
OWNER TO postgres;
当在没有并发的情况下运行时,即一次由一个用户运行时,您的函数对我来说是正确的 与: 然后 工作两次,然后无限递归失败 如果同时从多个会话调用函数,则该函数将无法正常工作。您必须在独占模式下锁定表驱动程序,或者准备处理唯一的冲突错误 我认为你真正想要的是一个不重复的随机序列,例如 顺便说一句,虽然:
(select count(alias) from drivers where alias = name limit 1) = 0
如果可行,您可能应该尝试:
exists (select 1 from drivers where alias = name limit 1)
通常更快。显示表结构和示例数据表包含id、名称和别名。Id由sequenzce创建,名称为varchar,别名为介于1和1000之间的bigint。我想通过函数创建的别名。别名列是唯一的。无法使用我的函数吗?@Pauli如果。。。然后结束,如果不是案例。。。什么时候终止否则它会工作的,这不是一个很好的方法来做我认为你实际上正在尝试做的事情,在并发下它也不会工作。如果你想生成随机但唯一的数字,使用上面链接的伪加密函数,它会更好。好的,我可以使用这个伪加密函数,但是我仍然没有得到不可求的随机数。我还需要使用IF…THEN…END IF部分吗?如何将输出减少到6?我需要一个介于1和999999之间的随机数。@Pauli pseudo_encrypt通过从序列生成唯一的伪随机数,完全替换了您的函数。只需创建序列my_random_number_seed;然后选择pseudo_encryptval'my_random_number_seed'。如果愿意,您可以将其包装在一个简单的语言sql函数中。@Pauli当与序列结合使用时,是的,它会。如果您不这么认为,请在此处发布一个新的问题链接,精确显示您是如何得出结论的,即它正在一步一步地产生非唯一值。
(select count(alias) from drivers where alias = name limit 1) = 0
exists (select 1 from drivers where alias = name limit 1)