| PostgreSQL | ||
|---|---|---|
| 上一页 | 第六章. 类型转换 | 下一页 |
操作符评估
在分类里只有一个指数操作符,它以 float8 作为参数.扫描器给下面查询表达式的两个参数赋予int4 的初始类型:
tgl=> select 2 ^ 3 AS "Exp"; Exp --- 8 (1 row)
分析器对两个参数都做类型转换,查询等效于:
tgl=> select float8(2) ^ float8(3) AS "Exp"; Exp --- 8 (1 row)
或
tgl=> select 2.0 ^ 3.0 AS "Exp"; Exp --- 8 (1 row)
注意 最后的形式最高效,因为不用调用函数做隐含类型转换.这对小查询没有什么影响,但可能对那些操作大表的查询的性能产生较大影响.
一种类字符串的语法既可以用于字符串也可以用于复杂的扩展类型.包含不明类型的字串使用可能的候选操作符匹配.
有一个未声明的参数:
tgl=> SELECT text 'abc' || 'def' AS "Text and Unknown"; Text and Unknown ---------------- abcdef (1 row)
本例中分析器寻找一个两个参数都是 text 的操作符.因为有一个这样的操作符,它认为另一个参数的类型是text.
联接未声明类型:
tgl=> SELECT 'abc' || 'def' AS "Unspecified"; Unspecified ----------- abcdef (1 row)
本例中对类型的初始值没有任何暗示,因为查询中没有声明任何类型.因此,分析器查找所有参数都是字符串类的候选操作符.并且它选择"优选类型"text作为本查询字符串类的类型.
注意: 如果用户定义了一个新的数据类型,并且定义了用于该类型的操作符 “||” ,那么本查询将不会象上面写的那样成功完成.这时分析器会因为现在有两类候选操作符而无法决定使用哪个.
本例演示了一个有趣的结果.一般来说,阶乘只用于整数,Postgres 操作符类别中用于阶乘的只有一个,其以整数为操作数.如果输入一个非整数数字参数.Postgres 将试图把该参数转换成整数进行阶乘运算.
tgl=> select (4.3 !);
?column?
--------
24
(1 row)
注意: 这样做当然会导致一个数学上有疑问的结果,因为非整数的阶乘原则没有定义.但是,数据库的角色不是数学教学,而是数据操作.如果用户一定要进行浮点数的阶乘,Postgres 将尽可能服从.
| 上一页 | 首页 | 下一页 |
| 类型转换 | 开头 | 函数 |