Requête sur substring - SQL/NoSQL - Programmation
Marsh Posté le 03-05-2006 à 15:31:16
Non , j'ai mal recopié.
En fait, en utilisant cette comande, les noms sont bien classés mais par IMG_+nombre croissant (alors que je veux du décroissant)
Marsh Posté le 03-05-2006 à 15:35:28
Converti ton substr() en Integer avec la fonction TO_INT de ton SGBD.
Et je pense que ton deuxieme parametre de substr commence à 1 et non pas à 0, auquel cas il te faudra mettre 5 et non pas 4. Enfin ton length(nom) me semble être effaçable, je crois que le dernier paramètre est optionnel et vu que tu veux récupérer toute la fin de ta chaine de caractere !
Marsh Posté le 04-05-2006 à 14:30:10
order by cast(substr(nom,5) as int) ne fonctionne pas non plus
Marsh Posté le 04-05-2006 à 15:25:39
Ben la je seche alors...evidemment je suppose qu'avec ce que tu viens de mettre ci dessus tu as bien mis le DESC en fin d'ORDER BY.
Je viens de tester ca rapidement sous Access et ca marche nickel, donc la logique SQL est bonne...le probleme doit être propre à mysql mais la je peux plus te répondre ! Bonne chance !
SELECT Numero FROM Test2 ORDER BY CInt(RIGHT(Numero, Len(Numero)-4)) DESC
Ps : quand tu dis fonctionne pas, ca veut dire quoi ? Message d'erreur ? Tri croissant ?
Marsh Posté le 04-05-2006 à 16:11:59
Si mais il classe comme ça :
IMG_8966
IMG_8540
IMG_6520
IMG_2150
IMG_11250
IMG_10890
Donc on est pas loin... faut juste qu'il comprenne que 11250 > 8966
Marsh Posté le 04-05-2006 à 16:21:06
Donc clairement un probleme de conversion de char en int !
Verifie que substr(nom,5) correspond bien à tes numéros en le faisant passer dans le select, juste pour vérifier que c'est bien 5 et non 4.
Ensuite...je comprend pas pourquoi ton cast ne fonctionne pas, mais la en fait, tu es clairement en situation ou tu tri des chaines de caracteres en ordre decroissant, et c'est pour cela que les 1 se retrouve en dernier.
Essaye ca "order by cast((substr(nom,5)) as int) desc" mais j'y crois pas trop !
Marsh Posté le 04-05-2006 à 16:30:20
Arf en fait je dois avoir un problème avec le cast... à chaque fois que je l'utilise j'ai une erreur sur le mysql_num_rows que j'utilise ensuite
Marsh Posté le 04-05-2006 à 16:33:29
Cherche du coté du cast, c'est clairement la que viens le probleme pour ton tri ! Et verifie bien que ton substr récupére bien un texte pouvant être converti en nombre.
Bonne chance !
Marsh Posté le 04-05-2006 à 18:09:25
Sous oracle on peut faire ca je crois je sais pas si ca marche sous my_sql :
select nom from table
order by lpad('00000', 5-length(nom)-4)||substr(nom,4) desc
en supposant que ton nombre n'est jamais supérieur à 5 chiffres.
je rajoute juste des zéros devant ton nombre selon sa longueur, ca évite les problèmes de CHAR vers INT.
Marsh Posté le 05-05-2006 à 11:36:36
Pas mal l'idée de rajouter des zéros devant !
Mais ça marche toujours pas...
dark > comment tester ce qu'il récupère ?
Marsh Posté le 05-05-2006 à 11:48:51
c'est bizarre j'ai testé chez moi et ca marche, ca te donne quoi comme résultats ?
Marsh Posté le 05-05-2006 à 14:09:33
darkfrost > il me sort bien la chaine que je veux, mais il n'arrive pas à la classer. Il y a une autre commande que cast en sql pour convertir des types de données ?
moonbot > bah ça donne :
0865
0796
0671
0254
01258
Marsh Posté le 05-05-2006 à 14:12:20
il te manque des zéros devant, c'est pour ça.
il faut que tu ajustes le nombre de zéros à mettre devant pour que tous tes nombres ait la mm longueur.
Marsh Posté le 05-05-2006 à 14:24:31
essaie ca plutôt :
select nom from table
order by lpad('00000', 5-length(substr(nom,4)))||substr(nom,4) desc
pour un numéro max à 5 chiffres, si c'est 6 chiffres tu mets 6 zéros et 6-length...etc...
Marsh Posté le 05-05-2006 à 14:34:10
moonboot a écrit : il te manque des zéros devant, c'est pour ça. |
C'est de la magouille comme je l'aime ça !! Et comme ca va logiquement marcher, on saura jamais pourquoi son cast ne marchait pas !
Concernant les autres commandes de Cast, aucune idée, ces commandes étant généralement lié au SGBD, je connais pas tellement le SQL de mysql !
Marsh Posté le 05-05-2006 à 14:41:30
Comment que vous êtes trop forts !!
Fallait qu'il y ait le même nombre de caractères
Merki !!
Pour info, j'ai fait ça :
lpad(substring(nom,4),9,'0')
Marsh Posté le 05-05-2006 à 14:46:00
A tout hasard, quelle est ta version de MySql ? Le cast ne marche qu'a partir de la 4.0.2...ca se trouve c'est pour ca ! Enfin le principal c'est que ca marche maintenant !
Marsh Posté le 05-05-2006 à 14:47:34
lol !
c'est vrai c'est de la super magouille il faudrait faire ca sur my sql
select nom
from table
order by cast(substr(nom,4) as int) desc
mais je crois que ca a déjà été dit avant
Marsh Posté le 03-05-2006 à 14:47:20
Bonjour,
Voilà mon problème : j'ai une table contenant entre autres un champs 'nom' de la forme 'IMG_ + un nombre'.
Je voudrais classer les noms selon ce nombre par ordre décroissant.
J'ai fait une requête comme ça :
SELECT nom FROM table order by substr(nom,4,length(nom)) DESC
mais ça ne fonctionne pas...
Auriez vous une idée ?
Message édité par sandy kylo le 03-05-2006 à 15:29:58