2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

36.14. 用户定义运算符 #

每个运算符都是对执行实际工作的底层函数的调用的“语法糖”;因此,您必须先创建底层函数,然后才能创建运算符。但是,运算符不仅仅是语法糖,因为它还携带了其他信息,这些信息有助于查询规划器优化使用该运算符的查询。下一节将专门解释这些额外信息。

PostgreSQL 支持前缀和中缀运算符。运算符可以重载;也就是说,相同的运算符名称可以用于具有不同数量和类型操作数的不同运算符。当执行查询时,系统会根据提供的操作数的数量和类型来确定要调用的运算符。

下面是一个创建用于两个复数相加的运算符的示例。我们假设已经创建了类型 complex 的定义(请参阅 36.13 节)。首先,我们需要一个执行此工作的函数,然后才能定义运算符。

CREATE FUNCTION complex_add(complex, complex)
    RETURNS complex
    AS 'filename', 'complex_add'
    LANGUAGE C IMMUTABLE STRICT;

CREATE OPERATOR + (
    leftarg = complex,
    rightarg = complex,
    function = complex_add,
    commutator = +
);

现在,我们可以执行如下查询:

SELECT (a + b) AS c FROM test_complex;

        c
-----------------
 (5.2,6.05)
 (133.42,144.95)

我们在此处展示了如何创建一个二进制运算符。要创建前缀运算符,只需省略 leftargfunction 子句和参数子句是 CREATE OPERATOR 中唯一必需的项。示例中显示的 commutator 子句是查询优化器的可选提示。有关 commutator 和其他优化器提示的更多详细信息,请参见下一节。

提交更正

如果您在文档中发现任何不正确、与您对特定功能的经验不符或需要进一步澄清的内容,请使用此表单报告文档问题。