【问题标题】:PostgreSQL function callPostgreSQL 函数调用
【发布时间】:2015-12-17 08:19:29
【问题描述】:

我有一个名为 test(integer) 的 PostgreSQL 函数,它带有一个 integer 参数和一个同名的重载函数 test(character varying)

当使用空值调用这个函数时,Postgres 总是执行带有integer 参数的函数。为什么会这样?为什么 Postgres 不选择带有varchar 参数的函数?

函数调用示例:

select test(null);

【问题讨论】:

  • 您的确切 Postgres 版本是什么,您使用哪个客户端进行测试?

标签: postgresql function types casting


【解决方案1】:

这是由Function Type Resolution 的规则决定的。手册中有详细解释。相关:

没有显式类型转换的 NULL 以“未知”类型开始:

SELECT pg_typeof(NULL)

 pg_typeof
-----------
 unknown

实际上,我产生了怀疑并进行了快速测试,只是为了在 Postgres 9.3 和 9.4 中找到不同的结果。 varchar 被选中 integer(这奇怪与您的发现相矛盾):

SQL Fiddle.

我认为相应的规则是point 4e in the list(之前的点都不能决定比赛):

在每个位置,如果有候选人接受,则选择字符串类别 那个类别。 (这种对字符串的偏见是适当的,因为 未知类型文字看起来像一个字符串。)

如果您将另一个输入类型为 text 的函数添加到重载组合中,则 text 将被选中而不是 varchar

我个人几乎总是使用text而不是varchartext 虽然是二进制兼容的(几乎但不完全相同),但在各个方面都更接近 Postgres 的核心。

我将它添加到小提琴中,以及 Postgres 无法决定并发脾气的另一个示例。

如果你想选择一个特定的函数,添加一个显式类型转换(这就是这里的方法!):

select test(null::int)     AS func_int
     , test(null::varchar) AS func_vc;

【讨论】:

    猜你喜欢
    • 2016-11-10
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 2021-11-09
    • 2011-02-09
    • 2019-01-04
    相关资源
    最近更新 更多