OVH Cloud OVH Cloud

STRING ou ENtier?

1 réponse
Avatar
jp.witz
J'ai une table mysql "MaTable" contenant un champ "justif " avec des
données du genre "U03/1","U03/2","U03/3",..."U03/99", "U03/100"
La donnée contenue dans ce champ a toujours le même préfixe ( U03/), suivi
d'un nombre qui s'incrémente à chaque fois..
Pour trouver le nombre maxi, j'utilise la commande sql suivante:

select max(SUBSTRING(justif ,5)) from MaTable where justif like 'U03/%'

Cela marche très bien jusqu'à 99. avec la donnée "U03/100" et plus, la
requête m'indique toujours 99.
Je précise que le champ "justif " est un champ "TEXT".
Le nombre résultat est-il considéré comme du texte? Quelle est la fonction
qui transforme ce texte en nombre?

Merci pour votre aide

Jean-Paul

1 réponse

Avatar
Fred BROUARD - SQLpro
1) utiliser un type TEXT pour une donnée aussi courte est une abération.
En effet le type text, sert à manipuler des blob, c'est à dire de TRES GROS
objet de type textuel. TEXT est limité 2 147 483 647 octets, soit un texte
d'environ 715 000 pages (de 50 lignes de 60 signes typo)... Autrement dans une
seule colonne de type TEXT, tu peut y mettre, la bible, le larousse et
l'annuaire téléphonique de PAris...)
Par conséquent les manipulations des colonnes de type TEXT sont très limités.
En l'occurence il aurait fallut utiliser un type CHAR ou VARCHAR ce type pouvant
aller jusqu'à plus de 8 000 octets (soit près de 3 pages de texte...)

2) pour changer le type d'une donnée il faut utiliser la fonction SQL CAST.
Exemple :
CAST('12345' AS INTEGER)

3) SUBSTRING prend 3 arguments : la colonne, le debut et le nombre d'occurence.
dans ton cas, il faut faire :

MAX(SUBSTRING(justif, 5, LEN(justif)-4)

LEN étant la fonction Transact SQL qui donne la longueur de la donnée.

4) pour ma part mélanger différentes données dans une seule colonne est une
abération qui se traduit par un modèle anormal et donc des manipulations
hasardeuses et contre performantes. Il aurait fallut créer deux colonnes, l'une
contenant le texte (JustifText = 'U03' par exemple) et l'autre le nombre
incrémenté (JustifNombre).
Ce n'est qu'au moment d'afficher les données qu'il faut recoller les morceaux.
Exemple :

SELECT JustifText + '/' + CAST(JustifNombre AS INTEGER) AS Justif...
FROM ...

Dès lors l'obtention du max aurait été un jeu d'enfant !

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************


jp.witz a écrit:
J'ai une table mysql "MaTable" contenant un champ "justif " avec des
données du genre "U03/1","U03/2","U03/3",..."U03/99", "U03/100"
La donnée contenue dans ce champ a toujours le même préfixe ( U03/), suivi
d'un nombre qui s'incrémente à chaque fois..
Pour trouver le nombre maxi, j'utilise la commande sql suivante:

select max(SUBSTRING(justif ,5)) from MaTable where justif like 'U03/%'

Cela marche très bien jusqu'à 99. avec la donnée "U03/100" et plus, la
requête m'indique toujours 99.
Je précise que le champ "justif " est un champ "TEXT".
Le nombre résultat est-il considéré comme du texte? Quelle est la fonction
qui transforme ce texte en nombre?

Merci pour votre aide

Jean-Paul