↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

不受支持的版本: 7.0 / 6.5
历史版本PostgreSQL 6.5 已于 2004 年 6 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本手册首页。

6.3. 函数

函数求值

  1. 在 pg_proc 系统目录中检查精确匹配。

  2. 寻找最佳匹配。

    1. 列出所有同名且参数个数相同的函数。

    2. 如果列表中只有一个函数,输入类型可强制转换时就使用它, 类型不能强制转换时就报错。

    3. 保留类型显式匹配最多的函数。如果没有 显式匹配则全部保留并进入下一步。 如果只剩一个候选,类型可强制转换时就使用它。

    4. 如果有输入参数是"unknown",把输入的候选参数归类为 boolean、numeric、string、geometric 或用户自定义。如果类别 混合,或者用户定义类型多于一个,就报错,因为 没有更多线索就无法推断出正确的选择。 如果只有一个类别,就把"首选类型"赋给 先前为"unknown"的输入列。

    5. 选择类型精确匹配最多且与上一步中每个列类别的 "首选类型"匹配的候选。 如果候选仍多于一个,或者一个也没有, 就报错。

6.3.1. 示例

6.3.1.1. 阶乘函数

pg_proc 目录中只定义了一个阶乘函数。 因此下面的查询自动把 int2 参数 转换为 int4:

tgl=> select int4fac(int2 '4');
int4fac
-------
     24
(1 row)

并且实际上被解析器变换为

tgl=> select int4fac(int4(int2 '4'));
int4fac
-------
     24
(1 row)

6.3.1.2. 子串函数

pg_proc 中声明了两个 substr 函数。但 只有一个接受两个参数,类型是 text 和 int4。

如果用未指定类型的字符串常量调用,该类型会直接 与唯一的候选函数类型匹配:

tgl=> select substr('1234', 3);
substr
------
    34
(1 row)

如果该字符串被声明为 varchar 类型(例如它 来自一张表时就是这种情况),则解析器会试图把它强制转换成 text:

tgl=> select substr(varchar '1234', 3);
substr
------
    34
(1 row)

它被解析器变换成

tgl=> select substr(text(varchar '1234'), 3);
substr
------
    34
(1 row)

注意

解析器中有一些启发式规则来优化 char、varchar 和 text 类型之间的 关系。在这个例子中,substr 直接用 varchar 字符串 调用,而不是插入显式的转换 调用。

而且,如果用 int4 调用该函数,解析器会 试图把它转换成 text:

tgl=> select substr(1234, 3);
substr
------
    34
(1 row)

实际执行为

tgl=> select substr(text(1234), 3);
substr
------
    34
(1 row)

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。