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 和其他最佳化器提示的更多詳細資訊,請參見下一節。

提交更正

如果您在文件中發現任何不正確、與您對特定功能的經驗不符或需要進一步澄清的內容,請使用此表單報告文件問題。