|
5.3. 操作符一次操作符调用的操作数类型是按照下面的过程解析的. 请注意这个过程受被调用操作符的优先级的间接影响. 参阅 Section 1.4 获取更多信息. 操作符类型解析
例子Example 5-1. 指数操作符类型解析 在分类里只有一个指数操作符,它以 double precision 作为参数.扫描器给下面查询表达式的两个参数赋予 integer 的初始类型: tgl=> SELECT 2 ^ 3 AS "Exp"; Exp ----- 8 (1 row) 分析器对两个参数都做类型转换,查询等效于: tgl=> SELECT CAST(2 AS double precision) ^ CAST(3 AS double precision) AS "Exp"; Exp ----- 8 (1 row) 或者 tgl=> SELECT 2.0 ^ 3.0 AS "Exp"; Exp ----- 8 (1 row)
Example 5-2. 字串连接操作符类型分析 一种类字符串的语法既可以用于字符串也可以用于复杂的扩展类型. 包含不明类型的字串使用可能的候选操作符匹配. 有一个未声明的参数的例子: 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 ,作为解析未知类型文本的声明类型. Example 5-3. 绝对值和阶乘类型分析 PostgreSQL 操作符表里面有几条 记录用于前缀操作符 @ ,所有这些都是为各种数值类型实现 绝对值操作的.其中有一条用于类型 float8 , 它是数值表中的优选类型.因此, 在面对非数值输入的时候, PostgreSQL 会使用该类型∶ tgl=> select @ text '-4.5' as "abs"; abs ----- 4.5 (1 row) 在这里系统在应用选定的操作符之前执行类一次 text 到 float8 的转换.我们可以验证它是 float8 而不是其它什么类型∶ tgl=> select @ text '-4.5e500' as "abs"; ERROR: Input '-4.5e500' is out of range for float8 另一方面,前缀操作符 ! (阶乘) 只为整数数据类型定义, 而不是为 float8 定义的.因此,如果我们用 ! 做类似 实验,就有∶ tgl=> select text '44' ! as "factorial"; ERROR: Unable to identify a postfix operator '!' for type 'text' You may need to add parentheses or an explicit cast 这是因为系统无法决定好几个可能的 ! 操作符中 应该用哪个.我们可以用明确地类型转换来帮它∶ tgl=> select cast(text '44' as int8) ! as "factorial"; factorial --------------------- 2673996885588443136 (1 row) |