PostgreSQL
上一页 第六章. 类型转换 下一页

函数

函数计算
  1. 在 pg_proc 系统表里查找准确的匹配.
  2. 查找最优的匹配
    1.  
    2. 生成一个具有相同数量参数的同名函数的列表.
    3. 如果表中只有一个函数,而且该函数的输入类型可以匹配或转换则使用之,如果不能,生成一个错误.
    4. 找出所有具有最多显式参数类型匹配的函数.如果没有显式参数匹配的函数则进行下一步.如果只有一个候选函数,而且其参数类型可以匹配或转换,使用之.
    5. 如果任何输入参数类型是"未知"("unknown"), 将输入的参数分类成布尔( boolean), 数字(numeric), 字符串(string), 几何(geometric)和用户定义(user-defined)类型.如果分类后有多于一类,或多于一种用户定义类型则生成一个错误,因为在没有更多线索的情况下不能导出正确的选择.如果分类结果只有一类,则将原先的"未知"("unknown")类型转换成该类的"优选类型" ("preferred type").
    6. 挑出类型匹配最准确的函数以及在上一步里每一类中匹配该类的"优选类型"("preferred type")的函数.如果这时仍然有多个函数可选,或一个都没有,则生成一个错误.

例子

阶乘函数

在 pg_proc 系统表里只定义了一个阶乘函数.所以下面的查询自动将 int2 参数转换成 int4
tgl=> select int4fac(int2 '4');
 int4fac
---------
      24
(1 row)
实际上它被分析器转换成:
tgl=> select int4fac(int4(int2 '4'));
 int4fac
---------
      24
(1 row)

子字串函数

在 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)
注意:分析器中有一些搜索器用于优化 charvarchar,和 text 类型之间的关系.这时,substr 将直接用 varchar 字符串调用,而不是在其中插入一个显式的类型转换调用.
而且,如果以 int4 为参数调用函数,分析器将试图将其转换成 text
tgl=> select substr(1234, 3);
 substr
--------
     34
(1 row)
实际上是这样执行的
tgl=> select substr(text(1234), 3);
 substr
--------
     34
(1 row)

上一页 首页 下一页
操作符 开头 查询目标