Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Postgres-Case When语句中的返回函数_Postgresql_Function_Random - Fatal编程技术网

Postgresql Postgres-Case When语句中的返回函数

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

嘿,我想创建一个随机数。当这个随机数已经存在时,我想一次又一次地调用随机数函数。在这种情况下,我需要在case-WHEN语句中返回randomnumber函数。 它不起作用。仍然获取错误,该号码已存在。我想为唯一列创建一个随机数:

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)