Aide pour l'écriture d'une requete SQL

Aide pour l'écriture d'une requete SQL - SQL/NoSQL - Programmation

Marsh Posté le 14-01-2004 à 15:34:57    

Je dois rédiger une requete SQL, mais là mes maigres connaissances en la matière risquent d'être insuffisantes :  
 
L'idée de la requete est la suivante :  
Select 'OK' from TABLE where CHAMP DE LA TABLE in (LISTE DE VALEUR)  
 
La liste de valeur est transmise en variable lors de l'appel de la requete.  
 
ça, c'est simple. Là où le problème se corse, c'est que je voudrais que le OK soit retourné seulement si toutes les valeurs de la liste sont présentes dans la table ...  
Si une seule des valeurs manque -> rien n'est retourné.  
 
C'est plutôt urgent. Merci pour le coup de main :jap:

Reply

Marsh Posté le 14-01-2004 à 15:34:57   

Reply

Marsh Posté le 14-01-2004 à 16:06:09    

quel sgbd ?

Reply

Marsh Posté le 14-01-2004 à 16:10:35    

vttman2 a écrit :

quel sgbd ?


 
Base oracle 9.2.0.3
 
Exécution des requetes via une connexion sqlplus standard.
 
quel rapport avec requete ??

Reply

Marsh Posté le 14-01-2004 à 16:52:22    

c pour savoir  
de quelle fonction SQL on(je) dispose pour résoudre
ton blème : decode, exist ou case, iif ...  
 

Reply

Marsh Posté le 14-01-2004 à 16:57:26    

vttman2 a écrit :

c pour savoir  
de quelle fonction SQL on(je) dispose pour résoudre
ton blème : decode, exist ou case, iif ...  
 
 


 
 
eeeeeeeeet .... ??  ;)  
 
il n'est pas possible d'écrire une condition qui dirait "toutes les valeurs de la liste existent dans ce champ de cette table de la BDD" ??
 

Reply

Marsh Posté le 14-01-2004 à 17:04:51    

J'm casse à l'instant ...
si d'ici demain t'as rien trouvé, ou pas de réponse
on regarde à nouveau !  
Bye ;-)

Reply

Marsh Posté le 14-01-2004 à 17:07:05    

merci.
 
D'cic là, d'autres personnes pour m'aider ??

Reply

Marsh Posté le 14-01-2004 à 17:38:21    

En gros tu veux que ça te retourne OK si toutes les valeurs de la liste sont dans la table ?


---------------
On ne vit qu'une fois, mais pour qui sait vivre, une seule fois suffit (Merril Stubbing)
Reply

Marsh Posté le 14-01-2004 à 17:53:04    

A part par une fonction, je vois pas autrement que :
 
select count(distinct(champ)) from table where champ in (liste) et tu vérifies que le compte égale le nombre d'éléments dans la liste...
 
Sinon faut faire une fonction mais je n'ai jamais passé de liste de taille variable en paramètre, donc faut que je cherche ou que quelqu'un aiguille un peu.


---------------
On ne vit qu'une fois, mais pour qui sait vivre, une seule fois suffit (Merril Stubbing)
Reply

Marsh Posté le 14-01-2004 à 19:08:19    

bill.fr a écrit :

A part par une fonction, je vois pas autrement que :
 
select count(distinct(champ)) from table where champ in (liste) et tu vérifies que le compte égale le nombre d'éléments dans la liste...
 
Sinon faut faire une fonction mais je n'ai jamais passé de liste de taille variable en paramètre, donc faut que je cherche ou que quelqu'un aiguille un peu.


 
je peux peut-être aiguiller un peu
 

Code :
  1. FUNCTION essai(ma_liste varchar2) RETURN BOOLEAN IS
  2.   lgr     number;       --la longueur de la liste
  3.   elem    varchar2(20); --l'élément de la liste que l'on va tester
  4.   nb      number;       --le nombre de réponses pour cet élément
  5.   nb_ok   number := 0;  --le nombre d'éléments qui sont ok
  6.   nb_elem number := 0;  --le nombre d'éléments total
  7.   pos_deb number := 1;  --position de curseur
  8.   pos_fin number := 2;  --
  9. BEGIN
  10.   lgr := length(ma_liste);
  11.   while pos_deb <= lgr loop
  12.     if substr(ma_liste, pos_deb, 1) = '''' then
  13.       pos_fin := pos_deb+1;
  14.       while pos_fin <= lgr loop
  15.         if substr(ma_liste, pos_fin, 1) = '''' then
  16.           elem := substr(ma_liste,pos_deb+1, pos_fin-pos_deb-1);
  17.           select count(*) into nb from login where login = chr(39)||elem||chr(39);
  18.           message(elem||':'||nb);
  19.           pos_deb := pos_fin+2;
  20.           pos_fin := pos_deb+1;
  21.         end if;
  22.         pos_fin :=pos_fin +1;
  23.       end loop;
  24.     end if;
  25.     pos_deb := pos_deb +1;
  26.   end loop;
  27.   if nb_elem = nb_ok then
  28.     return true;
  29.   else
  30.    return false;
  31.   end if;
  32. END;


 
sur le principe, il faut parcourir une liste telle que :
'NOM1','NOM2','NOM3' par exemple ?
tu as donc 2 variables pour te sortir
NOM1
NOM2
NOM3
d'où la double boucle...
bon, pour les positions, je me suis un peu embrouillé, mais sur le principe, cela devrait être bon...


Message édité par dalcap le 15-01-2004 à 12:36:46
Reply

Marsh Posté le 14-01-2004 à 19:08:19   

Reply

Marsh Posté le 14-01-2004 à 19:40:24    

Question bête...
En plus de la liste, est-ce que tu peux passer à la requête le nombre d'éléments de la liste ? A ce moment, ça se fait tout seul.
 
select decode(count(distinct champ), nbElements, 'OK', null) as res from table where champ in (liste)
 
Ca doit marcher.
Le problème des SGBD, c'est de retrouver le nombre d'éléments d'une liste. A partir du moment où on peut pallier à ce problème...
 
Edit :
- En gras : les paramètres
- En italique : le nom de tes objets


Message édité par MagicBuzz le 14-01-2004 à 19:42:00
Reply

Marsh Posté le 14-01-2004 à 21:21:57    

clap clap je pensais plsu au décode ;)


---------------
On ne vit qu'une fois, mais pour qui sait vivre, une seule fois suffit (Merril Stubbing)
Reply

Marsh Posté le 15-01-2004 à 10:59:26    

MagicBuzz a écrit :

Question bête...
En plus de la liste, est-ce que tu peux passer à la requête le nombre d'éléments de la liste ? A ce moment, ça se fait tout seul.
 
select decode(count(distinct champ), nbElements, 'OK', null) as res from table where champ in (liste)
 
Ca doit marcher.
Le problème des SGBD, c'est de retrouver le nombre d'éléments d'une liste. A partir du moment où on peut pallier à ce problème...
 
Edit :
- En gras : les paramètres
- En italique : le nom de tes objets


 
 
ça me parait pas mal ça ... suffit alors que je sorte le nombre d'éléments de la liste dans le programme appelant, par un awk, par exemple, et puis de le passer en paramètres, et le tour est joué...
 
Merci à tous.
 
juan

Reply

Marsh Posté le 15-01-2004 à 11:04:39    

Je viens de vérifier sous Oracle 8.je_sais_pas_combien
 
Et ça marche bien :
 
select decode(count(distinct codref), 4, 'OK', null) as res  
from tblref  
where codref in ('UNP', 'LOS', 'WON', 'DUP')  
and codtbl = 'TDRRES'
 
(à noter un filtre supplémentaire sur le champ 'codtbl', qui n'a rien à voir avec la requête initiale, c'est juste que sinon j'ai un peu plus de 800 000 lignes et je la sentais pas en "not in" :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed