2010-08-12 42 views
2

有沒有簡單的方法來爲PostgreSQL中的=運算符定義運算符別名?如何在PostgreSQL中定義運算符別名?

這是怎麼解決的!=<>運營商?似乎只有<>運算符在pg_operators中。 !=運營商是否是硬編碼的?

這是使用自定義運算符的應用程序所需的。在大多數環境中,這個操作符應該像=那樣工作,但是在某些情況下,我們通過創建自己的操作符和操作符類來定義特殊行爲。但是對於正常情況,我們的運營商應該只是=運營商的別名,以便它對於使用該實施的應用是透明的。

回答

1

只要檢查pgAdmin,模式pg_catalog。它包含所有的操作符,並向您展示如何爲所有數據類型創建它們。是的,您必須爲所有數據類型創建它們。所以這不僅僅是一個「別名」,你需要很多別名。

一個char = char的例子,使用!!!!作爲別名:

CREATE OPERATOR !!!! -- name 
(
    PROCEDURE = pg_catalog.chareq, 
    LEFTARG = "char", 
    RIGHTARG = "char", 
    COMMUTATOR = !!!!, -- the same as the name 
    RESTRICT = eqsel, 
    JOIN = eqjoinsel, 
    HASHES, 
    MERGES 
); 
SELECT 'a' !!!! 'a' -- true 
SELECT 'a' !!!! 'b' -- false 

檢查manual以及和注意的命名規則,它有一定的限制。

+0

那就是我到現在爲止所做的。但是爲了讓索引也能夠與該操作符一起工作,我還必須定義操作符類和家族,並且必須創建一個附加索引。例如,對於索引'CREATE INDEX idx_fk1 ON選項卡(fk);'另一個具有新操作類CREATE INDEX idx_fk2 ON選項卡(fk my_int4_ops)的索引;''是必需的,因此這兩個查詢都可以使用索引:'EXPLAIN ANALYSE SELECT * FROM tab WHERE fk = 1;'和'EXPLAIN ANALYSE SELECT * FROM tab where where fk !!!! 1;'。所以我想知道如果沒有創建很多新的指標,有沒有辦法。 – 2010-08-12 19:47:51

+0

很多工作和很多錯誤的空間。我會再次考慮並尋找更好的解決方案。 – 2010-08-12 20:29:28