2010-08-12 2 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 tab (fk); необходим еще один индекс с новым классом op' CREATE INDEX idx_fk2 ON tab (fk my_int4_ops); ', чтобы оба запроса могли использовать индексы:' EXPLAIN ANALYZE SELECT * FROM tab WHERE fk = 1; 'и' EXPLAIN ANALYZE SELECT * FROM tab WHERE fk !!!! 1; '. Поэтому я задавался вопросом, есть ли способ, не создавая много новых индексов. –

+0

Много работы и много места для ошибок. Я бы снова подумал и искал лучшее решение. –

 Смежные вопросы

  • Нет связанных вопросов^_^