Bonjour,
dans une vue parametrée, j'aimerais mettre une condition optionnel(dans le WHERE). des fois je devrai prendre tous les enregistrement, et des fois pas. Comment puis-je faire?
est-ce clair ? si non, pardon..
Merci d'avance
Version imprimable
Bonjour,
dans une vue parametrée, j'aimerais mettre une condition optionnel(dans le WHERE). des fois je devrai prendre tous les enregistrement, et des fois pas. Comment puis-je faire?
est-ce clair ? si non, pardon..
Merci d'avance
Merci de relire les règles du forum et par conséquent d'indiquer notamment votre SGBD et sa version.
Ensuite, soyez plus précis, donnez le code (simplifié ?) de votre vu ainsi qu'un jeu d'essais nous permettant de comprendre sans ambiguïté ce que vous souhaitez faire.
Enfin, si votre condition est relativement simple, avez-vous essayé d'utiliser la structure CASE WHEN (ou DECODE si vous êtes sur Oracle) ?
Excusez moi.
Je suis sous oracle 9i. Voici un exemple(très simplifier) de ce que je voudrais faire avec la solution la plus correct que j'ai trouvé :
dans ce code, ca me prend tous les enregistrement si je ne spécifie rien dans le champ par1 de ma table Param et sinon que l'enregistrement qui a l'id2 qui est égal au champ par1.Code:
1
2
3 select MaTable.ID from MaTable where Matable.id2 = nvl((select Param.par1 from Param),MaTable.id2)
Je suppose que param n'a qu'une ligne :
Code:
1
2 SELECT MaTable.ID FROM MaTable,Param WHERE Param.par1 is not null
Ok mais où être vous bloqué si vous avez déjà réussi à écrire votre requête, qu'elle est syntaxiquement correcte et qu'elle vous donne le résultat attendu ?Citation:
Envoyé par ehmppowa
oui, il n'a qu'une ligne.. par la suite lorsqu'il y aura plusieur utilisateur, je vais l'identifier grace a l'id de la session (userenv('sessionid'))..
Mon code fonctione, il fait ce que je veux, mais je pense pas que question performance ca soit le meilleur.. ma requete gère 60'000 enregistrement..
Une paille... pour un serveur optimisé !Citation:
Mon code fonctione, il fait ce que je veux, mais je pense pas que question performance ca soit le meilleur.. ma requete gère 60'000 enregistrement..
S'il devait y avoir plusieurs paramètres, la requête pourrait être écrite comme ça :
Code:
1
2
3
4
5
6
7
8
9
10 SELECT MaTable.* FROM MaTable WHERE EXISTS ( SELECT 1 FROM Param WHERE Param.SessionId = USERENV('sessionid') AND Matable.val1 = NVL(Param.par1, MaTable.val1) AND Matable.val2 = NVL(Param.par2, MaTable.val2) ) ;
oui j'sais 60'000 c'est pas énorme, mais comme ca touche énormément de table, j'voulais que ca soit instantané..
A ce que je vois, le nvl est la seul solution.
Merci a vous, a bientot
Ni la solution de al1_24 ni la mienne ne te convient ? je suis déçu :(Citation:
Envoyé par ehmppowa
le code d'al1_24 est quasi le meme que le mien sauf qu'il passe plusieur parametre.. et le tien :Citation:
Envoyé par chrifo
il sélectionne matable.id quand le param.par1 n'est pas null.. et quand il est null il en sélectionne aucun... c'est pas ce que je veux. dsl.. :roll: enfin je crois..Citation:
Envoyé par chrifo
J'ai essayer de faire comme ca pour passé mes paramètre (j'en ai 5 a passé) et ca me prendre 0.5 fois plus de temps que si je faisais a chaque fois un select. exemple :Citation:
Envoyé par al1_24
Code:
1
2
3
4
5
6
7
8
9 SELECT MaTable.* FROM MaTable WHERE ( AND Matable.val1 = NVL((SELECT Param.par1 FROM Param WHERE Param.SessionId = USERENV('sessionid')), MaTable.val1) AND Matable.val2 = NVL((SELECT Param.par2 FROM Param WHERE Param.SessionId = USERENV('sessionid')), MaTable.val2) ) ;