8797 sujets

Développement web côté serveur, CMS

Bonjour à vous !

J'ai une demande un peu particulière.

Nous stockons dans un champ des codes à 4 caractères. Le troisième caractère du champ correspond à un concept particulier dans sa catégorie (les deux premiers caractères).

J'ai donc besoin d'une requête qui me retourne tous les enregistrements dont le 3ème caractère du champ "code" vaut "2" (par exemple).

Pourriez-vous me guider s'il vous plaît ?

En attendant, je vais voir du côté des expressions régulières.

Merci d'avance !
Modifié par Alphonse (18 Feb 2008 - 16:18)
Ok, c'est résolu ! Je pensais mettre beaucoup plus de temps avant de trouver la solution... désolé !

Ceci fonctionne donc :

SELECT code FROM table WHERE SUBSTRING(table.code, 3, 1)=2
Administrateur
Pour plus de performances sur des grosses tables et si la requête se répète souvent, ne pas hésiter à créer un champ contenant uniquement le caractère recherché.
(+ placer un index)
Pour info on peut aussi faire des expressions regulieres avec Mysql, en revanche je ne sais pas quelle methode est la plus economique en terme de charge...

SELECT code FROM table WHERE code REGEXP '^..2'
Administrateur
à partir du moment où il y a une opération de calcul dans la clause where (like, regexp, substring, etc...), mysql est obligé de parcourir toute la table et ne peut se servir d'un index.
Merci pour toutes ces précisions !

Il semblerait qu'à la première exécution de chaque requête, la fonction SUBSTRING() est la plus rapide suivie de la commande LIKE et enfin le REGEXP.

Ca donnait ceci :
- SUBSTRING : 0,0099 sec.
- LIKE : 0,0113 sec.
- REGEXP : 0,0283 sec.

Bien sûr, c'est très approximatif et en fin de compte, pas toujours fiable.

dew> Effectivement, au niveau performence il serait plus intéressant d'isoler dans un champs ce 3ème nombre et d'y mettre un index. Cependant, il existe qu'une dizaine de codes distincts et cette liste de code n'est pas prête de changer ! ce qui fait que je vais mettre en dur dans ma requête chaque code qui contiendrait un 2 ou un 3 en troisième position.

Merci encore à vous tous pour vos remarques !