为什么没有 max(uuid)/min(uuid) 函数?

xeh*_*puk 7 postgresql max uuid postgresql-10

为什么我可以使用 UUID 对行进行排序:

SELECT uuid_nil()
ORDER BY 1;
Run Code Online (Sandbox Code Playgroud)

但我无法计算最大值:

SELECT max(uuid_nil());
Run Code Online (Sandbox Code Playgroud)

[42883] 错误:函数 max(uuid) 不存在
提示:没有函数与给定名称和参数类型匹配。您可能需要添加显式类型转换。

我知道我可以转换为字符类型 orORDER BYLIMIT 1。我只是好奇为什么我必须使用解决方法。

scr*_*avy 8

我想这是一个疏忽。>对我来说,你可以做、greatest、等leastorder by但不做min/没有任何意义max。这绝对是违反直觉的,也不是人们所期望的。

我这样定义它们:

create function min(uuid, uuid)
    returns uuid
    immutable parallel safe
    language plpgsql as
$$
begin
    return least($1, $2);
end
$$;

create aggregate min(uuid) (
    sfunc = min,
    stype = uuid,
    combinefunc = min,
    parallel = safe,
    sortop = operator (<)
    );

create function max(uuid, uuid)
    returns uuid
    immutable parallel safe
    language plpgsql as
$$
begin
    return greatest($1, $2);
end
$$;

create aggregate max(uuid) (
    sfunc = max,
    stype = uuid,
    combinefunc = max,
    parallel = safe,
    sortop = operator (>)
    );
Run Code Online (Sandbox Code Playgroud)

如果您希望这是幂等迁移的一部分,您需要确保这些函数不存在:

drop aggregate if exists max(uuid);
drop aggregate if exists min(uuid);
drop function if exists min(uuid, uuid);
drop function if exists max(uuid, uuid);
Run Code Online (Sandbox Code Playgroud)


Lau*_*lbe 4

我想说,没有人认为计算 UUID 的最大值有任何用处,我也看不到。

也就是说,如果您确实需要的话,可以很容易地CREATE AGGREGATE定义您自己的。max