Problème order by

Problème order by - SQL/NoSQL - Programmation

Marsh Posté le 11-08-2005 à 17:58:21    

Hello,
 
Désolé pour le sujet.. je n'arrivais pas à trouver un nom adéquat. Voila mon problème :
 
J'ai une table "LISTE" avec les éléments suivant :
A
B
C
D
E
 
J'aimerais effectuer une requete qui me retourne tous les noms de la liste triés par ordre alphabétique sauf celui donné en argument.
 
Exemple : je donne en paramètre 'C'
Le résultat de la requête devrait être
C
A
B
D
E
 
J'ai essayé beaucoup de choses, les produits cartésiens, les union, except, intersect sans trouver mon bonheur. Si quelqu'un avait la solution miracle sans faire 2 requêtes bien sur.
 
merci beaucoup

Reply

Marsh Posté le 11-08-2005 à 17:58:21   

Reply

Marsh Posté le 11-08-2005 à 18:02:48    

J'avais essayé de procéder de la sorte avec un union :
 
select nomListe from LISTE where nomListe = 'C'
union
SELECT nomListe from LISTE where nomListe <> 'C'  
 
Ce qui me donne
C
A
D
B
E
Car le moteur du sgbd me retourne les champs dans l'ordre qu'il les trouve dans la base...
 
J'ai également essayé :
 
select nomListe from LISTE where nomListe = 'C'
union
SELECT nomListe from LISTE where nomListe <> 'C' order by nomListe
 
ce qui me donne :
A
B
C
D
E
 
Donc cela ne va pas non plus :'(

Reply

Marsh Posté le 11-08-2005 à 18:34:40    

Suivant le SGBD, la requête suivante passera ou pas :
 
SELECT nomListe from LISTE where nomListe = 'C' order by nomListe
UNION
SELECT nomListe from LISTE where nomListe <> 'C' order by nomListe;

Reply

Marsh Posté le 11-08-2005 à 19:01:05    

C'est impossible de faire ça avec un Order by vu qu'il s'applique au resultat de la requete complète et non aux sous requêtes


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

Marsh Posté le 11-08-2005 à 19:06:35    

et avec des parenthèses ?
 
SELECT nomListe from LISTE where nomListe = 'C'
UNION  
(SELECT nomListe from LISTE where nomListe <> 'C' order by nomListe);
 
sinon, des sous-requêtes, ou un DECODE ou équivalent ... (ORDER BY DECODE(nomListe, 'C', <caractère le plus petit alphabétiquements>, nomListe))

Reply

Marsh Posté le 11-08-2005 à 19:11:39    

Beegee a écrit :

et avec des parenthèses ?
 
SELECT nomListe from LISTE where nomListe = 'C'
UNION  
(SELECT nomListe from LISTE where nomListe <> 'C' order by nomListe);


c'est pas du SQL standard :spamafote:

Beegee a écrit :


sinon, des sous-requêtes, ou un DECODE ou équivalent ... (ORDER BY DECODE(nomListe, 'C', <caractère le plus petit alphabétiquements>, nomListe))



---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

Marsh Posté le 11-08-2005 à 20:59:37    

SELECT nomListe FROM liste ORDER BY (nomListe='C') DESC, nomListe ASC [:figti]

Reply

Marsh Posté le 11-08-2005 à 21:04:42    

bien vu ;)

Reply

Marsh Posté le 11-08-2005 à 21:05:46    

Disons que ce n'est pas la 1ère fois que je me pose la question :whistle:

Reply

Marsh Posté le 12-08-2005 à 08:33:26    

Hello,
 
Merci de vos réponses, j'aime bien quand les gens se creusent la tête.. (hehe)
 
Mais aucune des fonctions proposées ne marchent.
 
Pour la dernière, mrbebert, j'ai une erreur de syntaxe sur la partie entre parenthèse  
"au niveau de l'élément ="
 
Snif snif, bon c'est pas grave. J'en ferais 2 requêtes, mais ça aurait pu être intéressant
d'avoir une solution.
 
Merci encore

Reply

Marsh Posté le 12-08-2005 à 08:33:26   

Reply

Marsh Posté le 12-08-2005 à 08:40:38    

Citation :

SELECT nomListe FROM liste ORDER BY (nomListe='C') DESC, nomListe ASC


 
magnifique et ca fonctionne sous MySQL (donc certainement sur tous les autres SGBD)!
les parentheses sont pas obligatoires en revanche

Reply

Marsh Posté le 12-08-2005 à 09:53:25    

betsamee a écrit :

Citation :

SELECT nomListe FROM liste ORDER BY (nomListe='C') DESC, nomListe ASC


 
magnifique et ca fonctionne sous MySQL (donc certainement sur tous les autres SGBD)!
les parentheses sont pas obligatoires en revanche


 
Ca ne fonctionne pas sur tous les autres sgbd ;)
Enfin en tout cas pas sur DB2/400. :'(

Reply

Marsh Posté le 12-08-2005 à 10:59:00    

betsamee a écrit :

Citation :

SELECT nomListe FROM liste ORDER BY (nomListe='C') DESC, nomListe ASC


 
magnifique et ca fonctionne sous MySQL (donc certainement sur tous les autres SGBD)!
les parentheses sont pas obligatoires en revanche


ça ne fonctionne ni sous SQL server, ni sous Oracle...


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

Marsh Posté le 12-08-2005 à 11:15:54    

betsamee a écrit :

Citation :

SELECT nomListe FROM liste ORDER BY (nomListe='C') DESC, nomListe ASC


 
magnifique et ca fonctionne sous MySQL (donc certainement sur tous les autres SGBD)!
les parentheses sont pas obligatoires en revanche


Toi tu ne connais que MySQL non?


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 12-08-2005 à 14:39:07    

Citation :

betsamee a écrit :
 
Citation :
 
SELECT nomListe FROM liste ORDER BY (nomListe='C') DESC, nomListe ASC  
 
 
 
 
magnifique et ca fonctionne sous MySQL (donc certainement sur tous les autres SGBD)!  
les parentheses sont pas obligatoires en revanche
 
 
Toi tu ne connais que MySQL non?


 
non O maitre supreme des bases de donnees
 
j'en connais certes bien moins que son altesse serenissime mais j'ai quelques connaissances en Oracle,Access et SQL SERVER

Reply

Marsh Posté le 12-08-2005 à 14:47:18    

betsamee a écrit :

non O maitre supreme des bases de donnees
 
j'en connais certes bien moins que son altesse serenissime mais j'ai quelques connaissances en Oracle,Access et SQL SERVER


chuis maître en rien du tout mais bon, tu t'avançais beaucoup :o (comme moi quelques fois :whistle:)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 12-08-2005 à 14:50:35    

Citation :

chuis maître en rien du tout mais bon, tu t'avançais beaucoup  (comme moi quelques fois )


 
t'as pas tort , je me suis un peu avance mais en general si MySQL peut faire quelque chose ...  :whistle:  :D

Reply

Marsh Posté le 12-08-2005 à 14:57:18    

Faudrait que t'apprennes à faire des quotes aussi :o
 
Et MySQL est beaucoup plus exotique que tu peux le penser ;)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 12-08-2005 à 15:06:50    

drasche a écrit :

Faudrait que t'apprennes à faire des quotes aussi :o
 
Et MySQL est beaucoup plus exotique que tu peux le penser ;)


 
c'est avec quotemsg apparement...
je suis habitue aux simples "quote" desole  :D

Reply

Marsh Posté le 12-08-2005 à 15:13:17    

betsamee a écrit :

t'as pas tort , je me suis un peu avance mais en general si MySQL peut faire quelque chose ...  :whistle:  :D


C'est soit un truc trivial (genre un select tout con), soit un truc non standard (genre l'order by que tu as fait) [:aloy]


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

Marsh Posté le 12-08-2005 à 15:26:17    

mareek a écrit :

ça ne fonctionne ni sous SQL server, ni sous Oracle...


 

betsamee a écrit :


non O maitre supreme des bases de donnees
 
j'en connais certes bien moins que son altesse serenissime mais j'ai quelques connaissances en Oracle,Access et SQL SERVER


 
 :D  :ange:  :sarcastic:  :heink:

Reply

Marsh Posté le 12-08-2005 à 16:06:50    

drasche a écrit :

Toi tu ne connais que MySQL non?


C'est clair, généralement, quand sur un autre SGBD ça marche, on se dit :
 
"il y a de fortes chances que ça marche sur tous les SGBD sans nécessiter trop d'adaptation"
 
Alors que quand c'est sous MySQL :
 
"bon, faut que je trouve un truc qui ne marche pas sous MySQL, j'ai peut-être une chance que ça marche sur les autres"
 
 :whistle:

Reply

Marsh Posté le 12-08-2005 à 16:12:57    

La coup du "DECODE" était bien vu, sauf que MySQL ne le supporte pas.
 
Dans la même idée, il y a le CASE que SQL Server et MySQL supportent de la même manière.
 

Code :
  1. select macolonne
  2. from matable
  3. order by case macolonne when 'C' then null else macolonne end


 
NULL est la première valeur dans la liste ASCII, et tous les SGBD la retournent en premier.
 
Testé sous SQL Server avec la requête :
 

Code :
  1. select code
  2. from organization
  3. where type = 'C'
  4. order by case code when 'MULTIORG' then null else code end


 
Et ça marche :)

Reply

Marsh Posté le 12-08-2005 à 16:14:43    

Ce qui est sur c'est que je vais pas installer MySql pour ce cas la :-)

Reply

Marsh Posté le 12-08-2005 à 16:34:16    

Arjuna a écrit :

La coup du "DECODE" était bien vu, sauf que MySQL ne le supporte pas.


Perdu :o
http://sunsite.mff.cuni.cz/MIRRORS [...] tions.html
 

Citation :

DECODE(crypt_str,pass_str)
    Descrypts the encrypted string crypt_str using pass_str as the password. crypt_str should be a string returned from ENCODE().


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 12-08-2005 à 16:45:41    

nevin0u a écrit :

Ce qui est sur c'est que je vais pas installer MySql pour ce cas la :-)


c'est quoi ton sgbd ?

Reply

Marsh Posté le 12-08-2005 à 16:48:11    

drasche a écrit :

Perdu :o
http://sunsite.mff.cuni.cz/MIRRORS [...] tions.html
 

Citation :

DECODE(crypt_str,pass_str)
    Descrypts the encrypted string crypt_str using pass_str as the password. crypt_str should be a string returned from ENCODE().



euh... nan, toi t'as perdu...
 
on est loin du decode d'oracle :lol:
 
je vois pas trop ce que tu pourrais en faire avec ça !
 
decode(val, condition1, remplacepar1, ..., conditionN, remplacerparN, default)
 
avec seuls les 3 premiers paramètres obligatoires
 
c'est un CASE sous forme de fonction, pas un truc batard d'encryption de mot de passe...

Reply

Marsh Posté le 12-08-2005 à 17:12:49    

bah ça doit exister en MySQL, c'est juste que j'ai pas cherché après :o
 
au pire on a les regexps :ange:


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 12-08-2005 à 17:39:31    

ben nan, t'as le case un point c'est tout. ça fait la même chose, pas besoin de réinventer la roue quand on a déjà un pneu. [:spamafote]


Message édité par Arjuna le 12-08-2005 à 17:39:39
Reply

Marsh Posté le 12-08-2005 à 20:07:54    

Arjuna a écrit :

c'est quoi ton sgbd ?


 
DB2/400.
 
Le problème à été résolu de manière logicielle mais si y'a un moyen de le faire avec une requête SQL ce serait instructif.

Reply

Marsh Posté le 13-08-2005 à 01:21:10    

Et DB2 supporte pas les CASE ?

Reply

Marsh Posté le 02-09-2005 à 01:00:20    

nevin0u a écrit :

Hello,
 
Désolé pour le sujet.. je n'arrivais pas à trouver un nom adéquat. Voila mon problème :
 
J'ai une table "LISTE" avec les éléments suivant :
A
B
C
D
E
 
J'aimerais effectuer une requete qui me retourne tous les noms de la liste triés par ordre alphabétique sauf celui donné en argument.
 
Exemple : je donne en paramètre 'C'
Le résultat de la requête devrait être
C
A
B
D
E
 
J'ai essayé beaucoup de choses, les produits cartésiens, les union, except, intersect sans trouver mon bonheur. Si quelqu'un avait la solution miracle sans faire 2 requêtes bien sur.
 
merci beaucoup


 
 
---------------------------------------------
 
Solution testée avec ORACLE 8i et 10g :
 
SELECT colx FROM
(  
 SELECT 1,colx FROM matable WHERE colx=valx
  UNION
 SELECT 2,colx from matable WHERE NOT (colx=valx)
 ORDER BY 1,colx
)
;
 
Principe :
 
Créer des partitions (sous-ensembles disjoints) de la table a traiter , dans l'exemple 2 partitions  
definies par les clauses 'select .... from .. where ... '
 
Leur affecter une colonne identifiant ordinal (valeurs = 1 , 2 ,3 , etc ... dans l'exemple 1 et 2  )
 
Réunir a nouveau les partitions ainsi créées pour recréer la table de depart  (UNION)
Trier l'ensemble ainsi obtenu en majeur selon ce même identifiant ordinal  
et eventuellement en mineur par la colonne colx (ORDER BY 1,colx | 1=identifiant ordinal )  
 
Ne selectionner que la (les) colonne(s) qui participent à la selection finale (colx dans l'exemple)
 
Ainsi la valeur valx apparait en debut de la sélection  
 
Remarques :
Moyennenement élégant mais ca marche !
Se mefier des valeurs null de colx  
 
Questions :
Est-ce bien standard ?
Qu'en est il dans les autres sgbd que je ne connais pas ?
 

Reply

Marsh Posté le 16-09-2005 à 16:57:32    

Hello,
 
Suite à ton MP Henri, j'ai quand m'eme voulu tester ta méthode
 
donc sur db2 400 la partie centrale marche parfaitement
"
SELECT 1,colx FROM matable WHERE colx=valx  
  UNION  
 SELECT 2,colx from matable WHERE NOT (colx=valx)  
 ORDER BY 1,colx  
"
 
Mais je n'ai pas réussi à l'encapsuler dans un autre Select, le parser ne le permet pas
 
Merci d'y avoir réfléchi
 
Bon week-end

Reply

Marsh Posté le 16-09-2005 à 19:58:09    

Euh... Vous êtes gortes les gars :o
 
Bon, je répète : DB2 supporte pas les CASE (ou DECODE) ?
 
Solution avec SQL Server :
 

Code :
  1. SELECT
  2.    CASE colx
  3.    WHEN @valx THEN 1
  4.    ELSE 2 as ord,
  5.    colx
  6. FROM matable
  7. ORDER BY ord


 
Et solution Oracle :

Code :
  1. SELECT
  2.    DECODE(colx, :valx, 1, 2) as ord,
  3.    colx
  4. FROM matable
  5. ORDER BY ord


 
C'est quand même plus propre et plus rapide que de faire des UNION et des sous-SELECT :o
 
Evidement, pour ça, il faut connaître la syntaxe de DB2 pour faire un CASE.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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