[MySQL 3.23] Comment faire un CAST() ou CONVERT()

Mammouth du PHP | 19672 Messages

20 févr. 2008, 15:42

Salut tout le monde,
je dois utiliser une antiquité, MySQL 3.23 et je me heurte à un petit problème de tri. (Et on ne rit pas, si j'avais le choix, je t'enverrais ça dans les oubliettes à la vitesse de la lumière pour mettre une 5.x.x à la place :mrgreen:)

Je cherche une astuce pour faire un CAST sur des données sachant que CAST() et CONVERT n'ont été introduits qu'à partir de MySQL 4.x.x

Une idée (autrement que par programmation, ça je sais faire, merci), peut-être un truc qui m'aurait échappé ?
Modifié en dernier par Cyrano le 21 févr. 2008, 08:46, modifié 1 fois.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 1024 Messages

20 févr. 2008, 16:07

quel genre de données ?

tu peux trier sur différents bouts de chaines, par contre coté perfs, hum hum.

A+

Pascal

Mammouth du PHP | 19672 Messages

20 févr. 2008, 16:11

Disons que je n'ai pas la main sur le serveur et c'est pour des numéros d'adresses.

S'il n'en avait tenu qu'à moi, j'aurais parsé les données pour séparer en deux colonnes le numéro et le complément (ex. "21" d'un coté en SMALLINT et "bis" de l'autre en VARCHAR ou assimilé). Au lieu de ça toute la colonne est en VARCHAR et le tri se fait donc alphabétiquement et non numériquement. J'ai quand mêmela chance d'avoir le nom de la rue séparément. :mrgreen:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

20 févr. 2008, 18:47

Code : Tout sélectionner

SELECT numero + 0
...devrait le CASTer en FLOAT, d'une manière similaire à PHP. '123bis' + 0 === 123

Ceci dit, ça reste à vérifier sous 3.23.
"21" d'un coté en SMALLINT et "bis" de l'autre en VARCHAR
Mais il est nul ton système, samarchpu si le gars habite au 65536 rue Vaugirard ! :lol: Avec un gros VARCHAR, plus de problèmes ! :pouce:

Mammouth du PHP | 19672 Messages

20 févr. 2008, 19:04

Mais il est nul ton système, samarchpu si le gars habite au 65536 rue Vaugirard ! :lol: Avec un gros VARCHAR, plus de problèmes ! :pouce:
Mouarf... alors question à deux balles : quel est le plus haut numéro d'une rue en Île de France ? :mrgreen:

Pour l'astuce, j'essayerai demain, chez moi, j'ai que la version 5 qui est installée. ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 5924 Messages

20 févr. 2008, 19:35

Pour l'astuce, j'essayerai demain, chez moi, j'ai que la version 5 qui est installée. ;)
Mouarf, le has been, t'en es même pas à la version 3 ? :mrgreen:

Mammouth du PHP | 19672 Messages

21 févr. 2008, 08:45

Bon ben chapeau bas Hubert, ton truc fonctionne très bien. :merci:

Pour obtenir mes numéros dans le bon ordre, mais mes numéros complets, ma requête est du genre:

Code : Tout sélectionner

SELECT adr_numero, A.adr_code_postal FROM ADRESSE A ORDER BY A.adr_code_postal, (A.adr_numero + 0);
Le retour me donne bien les numéros avec le complément éventuel, mais le tri est sur la valeur numérique.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

22 févr. 2008, 11:10

You wescome :)

Je crois que t'as inversé l'ordre des colonnes dans ton exemple, vérifie que tout marche bien comme prévu même avec les cas les plus étranges. [Màj : ah ben non, j'avions mal lu le nom des colonnes] D'ailleurs, si on voulait pousser le bouchon, on pourrait utiliser FIELD() pour classer d'après le suffixe (ce qui est après le nombre), par exemple

Code : Tout sélectionner

ORDER BY (adr_numero + 0), FIELD(SUBSTR(adr_numero, 1 + LENGTH(a+0)), 'bis', 'ter')
Sans suffixe ou avec un suffixe inconnu, FIELD() retournerait 0. On pourrait ajouter '' (pas de suffixe) et inverser l'ordre pour mettre les "pas de suffixes" en premier, les suffixes connus ("bis", "b", "ter", etc...) et finalement les suffixes inconnus en dernier, eg

Code : Tout sélectionner

ORDER BY (adr_numero + 0), FIELD(SUBSTR(adr_numero, 1 + LENGTH(a+0)), 'ter', 'bis', '') DESC