支援的版本:目前 (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和其他最佳化器提示的更多詳細資訊,請參閱下一節。

提交更正

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