Requête sur substring

Requête sur substring - SQL/NoSQL - Programmation

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 ?
 :jap:


Message édité par sandy kylo le 03-05-2006 à 15:29:58
Reply

Marsh Posté le 03-05-2006 à 14:47:20   

Reply

Marsh Posté le 03-05-2006 à 14:56:03    

length ?

Reply

Marsh Posté le 03-05-2006 à 15:31:16    

Non  :D , 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)

Reply

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

Reply

Marsh Posté le 04-05-2006 à 14:30:10    

order by cast(substr(nom,5) as int) ne fonctionne pas non plus :(

Reply

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 ?


Message édité par darkfrost le 04-05-2006 à 15:26:13
Reply

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


Message édité par sandy kylo le 04-05-2006 à 16:18:13
Reply

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 :d !
 

Reply

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

Reply

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

Reply

Marsh Posté le 04-05-2006 à 16:33:29   

Reply

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.

Reply

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...  :cry:  
dark > comment tester ce qu'il récupère ?


Message édité par sandy kylo le 05-05-2006 à 11:36:47
Reply

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 ?

Reply

Marsh Posté le 05-05-2006 à 13:07:57    

ben tu met ton substr dans ton select

Reply

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

Reply

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.

Reply

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

Reply

Marsh Posté le 05-05-2006 à 14:34:10    

moonboot a écrit :

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.


 
C'est de la magouille comme je l'aime ça :D !! 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 ;) !
 

Reply

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  :pt1cable:  
Merki !!
Pour info, j'ai fait ça :
lpad(substring(nom,4),9,'0')

Reply

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

Reply

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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