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

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Requête sur substring

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Requête sur substring

n°1358649
sandy kylo
Posté le 03-05-2006 à 14:47:20  profilanswer
 

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
mood
Publicité
Posté le 03-05-2006 à 14:47:20  profilanswer
 

n°1358660
jagstang
Pa Capona ಠ_ಠ
Posté le 03-05-2006 à 14:56:03  profilanswer
 

length ?

n°1358714
sandy kylo
Posté le 03-05-2006 à 15:31:16  profilanswer
 

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)

n°1358720
darkfrost
Posté le 03-05-2006 à 15:35:28  profilanswer
 

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

n°1359612
sandy kylo
Posté le 04-05-2006 à 14:30:10  profilanswer
 

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

n°1359712
darkfrost
Posté le 04-05-2006 à 15:25:39  profilanswer
 

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
n°1359763
sandy kylo
Posté le 04-05-2006 à 16:11:59  profilanswer
 

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
n°1359770
darkfrost
Posté le 04-05-2006 à 16:21:06  profilanswer
 

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 !
 

n°1359782
sandy kylo
Posté le 04-05-2006 à 16:30:20  profilanswer
 

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:

n°1359786
darkfrost
Posté le 04-05-2006 à 16:33:29  profilanswer
 

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

mood
Publicité
Posté le 04-05-2006 à 16:33:29  profilanswer
 

n°1359910
moonboot
Posté le 04-05-2006 à 18:09:25  profilanswer
 

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.

n°1360307
sandy kylo
Posté le 05-05-2006 à 11:36:36  profilanswer
 

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
n°1360322
moonboot
Posté le 05-05-2006 à 11:48:51  profilanswer
 

c'est bizarre j'ai testé chez moi et ca marche, ca te donne quoi comme résultats ?

n°1360363
darkfrost
Posté le 05-05-2006 à 13:07:57  profilanswer
 

ben tu met ton substr dans ton select

n°1360412
sandy kylo
Posté le 05-05-2006 à 14:09:33  profilanswer
 

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

n°1360418
moonboot
Posté le 05-05-2006 à 14:12:20  profilanswer
 

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.

n°1360430
moonboot
Posté le 05-05-2006 à 14:24:31  profilanswer
 

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

n°1360438
darkfrost
Posté le 05-05-2006 à 14:34:10  profilanswer
 

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

n°1360445
sandy kylo
Posté le 05-05-2006 à 14:41:30  profilanswer
 

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

n°1360448
darkfrost
Posté le 05-05-2006 à 14:46:00  profilanswer
 

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

n°1360452
moonboot
Posté le 05-05-2006 à 14:47:34  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


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

  Requête sur substring

 

Sujets relatifs
Requête : SELECT * FROM = ok , mais SELECT id, ... FROM = koRequête champs calculés
authentification parfeu requete phpconvertir macro excel en requete SQL
Requête SQL avec VBpblm de requete SQL besoin aide !!!
ACCESS requete ajout Insert into - a l'aide !AJAX et firefox j'arrive pas a envoyer une requete POST
[SAGE] requete sql via odbc sous sage gestion commercial ligne 100[MFC et ODBC] Requete SQL
Plus de sujets relatifs à : Requête sur substring


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