2016-08-25 2 views
1

Est-il possible de remplacer un mot dans une clause WHERE d'une instruction SELECT par une règle (CREATE RULE myrule AS ON SELECT TO mytable ...)?Règle de Postgres pour remplacer le mot dans la clause WHERE

SELECT col1, col2 
FROM mytable 
WHERE col2 = 1; 

devrait devenir

SELECT col1, col2 
FROM mytable 
WHERE col3 = 1; 

La déclaration initiale est émise par un client qui ne permet pas la substitution. Par conséquent, la substitution doit être effectuée du côté de la base de données.

** modifier **

Je ne pourrais pas avoir été assez précis. J'ai besoin d'une substitution de nom de colonne pour ce type de modèle de l'instruction select. La clause WHERE change constamment. Ainsi que le Est-il possible de se référer à l'instruction SELECT en cours dans la règle elle-même?

VENTILEES au strict minimum ce que je dois:

  • prendre l'instruction en cours SELECT (si elle a ce certain modèle)
  • remplacer « OÙ col2 » avec « Où col3 »
  • tassée dans une règle qui peut être déployée sur le côté de la base de données des choses
+0

Vous pouvez rendre le SQL dynamique, où vous passez tous les trois paramètres (plutôt que des littéraux), puis le gérer de sorte que lorsqu'il obtient un paramètre vide, il devient vrai ... par exemple 'where (col1 =? ou ? est nul) et (col2 =? ou? est nul) ' – Hambone

+0

Non, ce n'est pas possible. Si vous pouviez définir la règle, la requête retournera 'col1, col3' au lieu de' col1, col2'. – klin

+0

c'est pourquoi la substitution dans mon exemple inclut le WHERE afin de s'assurer que seul le nom de la table dans la clause WHERE serait remplacé – andehhh

Répondre

1

utilisation case when déclaration

SELECT col1, col2, col3 
FROM mytable 
WHERE CASE WHEN foo='bar' THEN col3 ELSE col1 END = 1;