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

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Problème order by

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème order by

n°1174807
nevin0u
Posté le 11-08-2005 à 17:58:21  profilanswer
 

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

mood
Publicité
Posté le 11-08-2005 à 17:58:21  profilanswer
 

n°1174812
nevin0u
Posté le 11-08-2005 à 18:02:48  profilanswer
 

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 :'(

n°1174844
Beegee
Posté le 11-08-2005 à 18:34:40  profilanswer
 

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;

n°1174855
mareek
Et de 3 \o/
Posté le 11-08-2005 à 19:01:05  profilanswer
 

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
n°1174862
Beegee
Posté le 11-08-2005 à 19:06:35  profilanswer
 

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))

n°1174866
mareek
Et de 3 \o/
Posté le 11-08-2005 à 19:11:39  profilanswer
 

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
n°1174903
mrbebert
Posté le 11-08-2005 à 20:59:37  profilanswer
 

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

n°1174907
Beegee
Posté le 11-08-2005 à 21:04:42  profilanswer
 

bien vu ;)

n°1174908
mrbebert
Posté le 11-08-2005 à 21:05:46  profilanswer
 

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

n°1175015
nevin0u
Posté le 12-08-2005 à 08:33:26  profilanswer
 

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

mood
Publicité
Posté le 12-08-2005 à 08:33:26  profilanswer
 

n°1175016
betsamee
Asterisk Zeperyl
Posté le 12-08-2005 à 08:40:38  profilanswer
 

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

n°1175035
nevin0u
Posté le 12-08-2005 à 09:53:25  profilanswer
 

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. :'(

n°1175081
mareek
Et de 3 \o/
Posté le 12-08-2005 à 10:59:00  profilanswer
 

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
n°1175088
drasche
Posté le 12-08-2005 à 11:15:54  profilanswer
 

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)
n°1175221
betsamee
Asterisk Zeperyl
Posté le 12-08-2005 à 14:39:07  profilanswer
 

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

n°1175228
drasche
Posté le 12-08-2005 à 14:47:18  profilanswer
 

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)
n°1175231
betsamee
Asterisk Zeperyl
Posté le 12-08-2005 à 14:50:35  profilanswer
 

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

n°1175234
drasche
Posté le 12-08-2005 à 14:57:18  profilanswer
 

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)
n°1175248
betsamee
Asterisk Zeperyl
Posté le 12-08-2005 à 15:06:50  profilanswer
 

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

n°1175251
mareek
Et de 3 \o/
Posté le 12-08-2005 à 15:13:17  profilanswer
 

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
n°1175272
betsamee
Asterisk Zeperyl
Posté le 12-08-2005 à 15:26:17  profilanswer
 

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:

n°1175299
Arjuna
Aircraft Ident.: F-MBSD
Posté le 12-08-2005 à 16:06:50  profilanswer
 

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:

n°1175307
Arjuna
Aircraft Ident.: F-MBSD
Posté le 12-08-2005 à 16:12:57  profilanswer
 

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 :)

n°1175311
nevin0u
Posté le 12-08-2005 à 16:14:43  profilanswer
 

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

n°1175322
drasche
Posté le 12-08-2005 à 16:34:16  profilanswer
 

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)
n°1175335
Arjuna
Aircraft Ident.: F-MBSD
Posté le 12-08-2005 à 16:45:41  profilanswer
 

nevin0u a écrit :

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


c'est quoi ton sgbd ?

n°1175338
Arjuna
Aircraft Ident.: F-MBSD
Posté le 12-08-2005 à 16:48:11  profilanswer
 

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...

n°1175357
drasche
Posté le 12-08-2005 à 17:12:49  profilanswer
 

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)
n°1175382
Arjuna
Aircraft Ident.: F-MBSD
Posté le 12-08-2005 à 17:39:31  profilanswer
 

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
n°1175467
nevin0u
Posté le 12-08-2005 à 20:07:54  profilanswer
 

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.

n°1175579
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-08-2005 à 01:21:10  profilanswer
 

Et DB2 supporte pas les CASE ?

n°1190092
henri6611
Posté le 02-09-2005 à 01:00:20  profilanswer
 

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 ?
 

n°1201231
nevin0u
Posté le 16-09-2005 à 16:57:32  profilanswer
 

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

n°1201347
Arjuna
Aircraft Ident.: F-MBSD
Posté le 16-09-2005 à 19:58:09  profilanswer
 

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.

mood
Publicité
Posté le   profilanswer
 


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

  Problème order by

 

Sujets relatifs
[VB.NET] Problème étrange...Aide svpProblème avec un script de téléchargement
Problème avec $_GETProblème de tableau array
Probleme de header(...)Problème pour parser une page web au niveau de fgets().
Probleme DBGrid Delphi selection celluleProbleme de compilation Visual C++, enfin je crois
Probleme avec l'instruction ORDER BY[php mySQL] ! ptit problème avec select distinct et order by
Plus de sujets relatifs à : Problème order by


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