Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1434 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Aide pour l'écriture d'une requete SQL

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Aide pour l'écriture d'une requete SQL

n°611683
juan72
Posté le 14-01-2004 à 15:34:57  profilanswer
 

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:

mood
Publicité
Posté le 14-01-2004 à 15:34:57  profilanswer
 

n°611714
vttman2
Je suis Open ...
Posté le 14-01-2004 à 16:06:09  profilanswer
 

quel sgbd ?

n°611716
juan72
Posté le 14-01-2004 à 16:10:35  profilanswer
 

vttman2 a écrit :

quel sgbd ?


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

n°611730
vttman2
Je suis Open ...
Posté le 14-01-2004 à 16:52:22  profilanswer
 

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

n°611736
juan72
Posté le 14-01-2004 à 16:57:26  profilanswer
 

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" ??
 

n°611753
vttman2
Je suis Open ...
Posté le 14-01-2004 à 17:04:51  profilanswer
 

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

n°611760
juan72
Posté le 14-01-2004 à 17:07:05  profilanswer
 

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

n°611788
bill.fr
Posté le 14-01-2004 à 17:38:21  profilanswer
 

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)
n°611804
bill.fr
Posté le 14-01-2004 à 17:53:04  profilanswer
 

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)
n°611850
dalcap
Posté le 14-01-2004 à 19:08:19  profilanswer
 

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
mood
Publicité
Posté le 14-01-2004 à 19:08:19  profilanswer
 

n°611867
MagicBuzz
Posté le 14-01-2004 à 19:40:24  profilanswer
 

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
n°611957
bill.fr
Posté le 14-01-2004 à 21:21:57  profilanswer
 

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)
n°612322
juan72
Posté le 15-01-2004 à 10:59:26  profilanswer
 

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

n°612327
MagicBuzz
Posté le 15-01-2004 à 11:04:39  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Aide pour l'écriture d'une requete SQL

 

Sujets relatifs
[SQL Server] Ressources lock bloquées par d'autres processusun ptit peu d'aide pour noob
[MS-SQL] Comment faire le Limit [offset] du MySQL[JS] Besoins d'un peu d'aide
requete SQLrhaaaaa requete à la con! :/
aider moi a faire ma requete Sql Svp[access] Liste déroulante et requête [Résolu]
Plus de sujets relatifs à : Aide pour l'écriture d'une requete SQL


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR