Problème order by - SQL/NoSQL - Programmation
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
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;
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
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))
Marsh Posté le 11-08-2005 à 19:11:39
Beegee a écrit : et avec des parenthèses ? |
c'est pas du SQL standard
Beegee a écrit : |
Marsh Posté le 11-08-2005 à 20:59:37
SELECT nomListe FROM liste ORDER BY (nomListe='C') DESC, nomListe ASC
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
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
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
Marsh Posté le 12-08-2005 à 09:53:25
betsamee a écrit :
|
Ca ne fonctionne pas sur tous les autres sgbd
Enfin en tout cas pas sur DB2/400.
Marsh Posté le 12-08-2005 à 10:59:00
betsamee a écrit :
|
ça ne fonctionne ni sous SQL server, ni sous Oracle...
Marsh Posté le 12-08-2005 à 11:15:54
betsamee a écrit :
|
Toi tu ne connais que MySQL non?
Marsh Posté le 12-08-2005 à 14:39:07
Citation : 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
Marsh Posté le 12-08-2005 à 14:47:18
betsamee a écrit : non O maitre supreme des bases de donnees |
chuis maître en rien du tout mais bon, tu t'avançais beaucoup (comme moi quelques fois )
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 ...
Marsh Posté le 12-08-2005 à 14:57:18
Faudrait que t'apprennes à faire des quotes aussi
Et MySQL est beaucoup plus exotique que tu peux le penser
Marsh Posté le 12-08-2005 à 15:06:50
drasche a écrit : Faudrait que t'apprennes à faire des quotes aussi |
c'est avec quotemsg apparement...
je suis habitue aux simples "quote" desole
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 ... |
C'est soit un truc trivial (genre un select tout con), soit un truc non standard (genre l'order by que tu as fait)
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 : |
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"
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 :
|
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 :
|
Et ça marche
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 :-)
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
http://sunsite.mff.cuni.cz/MIRRORS [...] tions.html
Citation : DECODE(crypt_str,pass_str) |
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 ?
Marsh Posté le 12-08-2005 à 16:48:11
drasche a écrit : Perdu
|
euh... nan, toi t'as perdu...
on est loin du decode d'oracle
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...
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
au pire on a les regexps
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.
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.
Marsh Posté le 02-09-2005 à 01:00:20
nevin0u a écrit : Hello, |
---------------------------------------------
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 ?
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
Marsh Posté le 16-09-2005 à 19:58:09
Euh... Vous êtes gortes les gars
Bon, je répète : DB2 supporte pas les CASE (ou DECODE) ?
Solution avec SQL Server :
Code :
|
Et solution Oracle :
Code :
|
C'est quand même plus propre et plus rapide que de faire des UNION et des sous-SELECT
Evidement, pour ça, il faut connaître la syntaxe de DB2 pour faire un CASE.
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