🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 35.12\. 用户定义操作符 每个操作符都是对真正干活的对应函数的"语义修饰"; 所以你在创建操作符之前必须先创建对应的函数。不过,一个操作符也并_不仅仅_ 是语义修饰,因为它还带着可以帮助查询规划器优化查询使用该操作符的附加信息。 下一节将用于解释这些附加信息。 PostgreSQL支持左目、右目、双目操作符。操作符可以重载; 也就是说,同一个操作符名可以用于不同数目和类型的操作数的操作符。在执行一个查询的时候, 系统从提供的操作数的数量和类型上判断需要调用哪个操作符。 下面是一个创建用于两个复数相加的操作符的例子。假设已经创建了`complex` (见节[Section 35.11](#calibre_link-837))类型的定义。首先需要做相加工作的函数;然后就可以定义操作符: ``` CREATE FUNCTION complex_add(complex, complex) RETURNS complex AS '_filename_', 'complex_add' LANGUAGE C IMMUTABLE STRICT; CREATE OPERATOR + ( leftarg = complex, rightarg = complex, procedure = complex_add, commutator = + ); ``` 现在可以执行像下面这样的查询: ``` SELECT (a + b) AS c FROM test_complex; c ----------------- (5.2,6.05) (133.42,144.95) ``` 在这里已经演示了如何创建双目操作符。要创建单目操作符,只需要省略`leftarg` 或者`rightarg`即可。只有`procedure`子句和参数(argument)子句是 `CREATE OPERATOR`里需要的条目。例子里演示的`commutator` 子句是一个给查询优化器的可选暗示。关于`commutator` 和其它优化器提示的详细信息在下节给出。