2010-08-12 7 views
2

Existe-t-il un moyen facile de définir un alias d'opérateur pour l'opérateur = dans PostgreSQL?Comment définir un alias d'opérateur dans PostgreSQL?

Comment cela est-il résolu pour les opérateurs != et <>? Seul l'opérateur <> semble être dans pg_operators. L'opérateur != est-il codé en dur?

Ceci est nécessaire pour une application qui utilise un opérateur auto-défini. Dans la plupart des environnements, cet opérateur doit agir comme un =, mais dans certains cas, nous définissons un comportement spécial en créant un opérateur et une classe d'opérateur. Mais pour le cas normal, notre opérateur devrait juste être un alias pour l'opérateur =, de sorte qu'il soit transparent pour l'application dont l'implémentation est utilisée.

Répondre

1

Vérifiez simplement pgAdmin, le schéma pg_catalog. Il a tous les opérateurs et vous montre comment les créer pour tous les types de données. Oui, vous devez les créer pour tous les types de données. Donc, ce n'est pas un simple "alias", vous avez besoin de beaucoup d'aliasses.

Exemple pour un char = char, en utilisant !!!! comme alias:

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 

Vérifiez la manual ainsi et de faire attention aux règles de nommage, il a quelques restrictions.

+0

C'est ce que je faisais jusqu'à maintenant. Mais pour que les index fonctionnent aussi avec cet opérateur, je dois aussi définir une classe d'opérateur et une famille et créer un index supplémentaire. Par exemple pour l'index 'CREATE INDEX idx_fk1 ON onglet (fk);' un autre index avec la nouvelle classe op 'CREATE INDEX idx_fk2 ON onglet (fk my_int4_ops);' est nécessaire pour que les deux requêtes puissent utiliser des index: 'EXPLAIN ANALYZE SELECT * FROM onglet WHERE fk = 1; 'et' EXPLAIN ANALYZE SELECT * DE l'onglet WHERE fk !!!! 1; ' Donc je me demandais s'il y avait un moyen sans créer beaucoup de nouveaux indices. –

+0

Beaucoup de travail et beaucoup de place pour les erreurs. Je pense encore et chercher une meilleure solution. –

Questions connexes