8768 sujets

Développement web côté serveur, CMS

Bonjour à tous
La version de MySQL dont je dispose est 5.6.28 et la fonction REGEXP_REPLACE n'est pas disponible sous cette version. Tout ce qu'on sait faire avec une expression régulière est une comparaison.
Je cherche donc une autre façon de supprimer les caractères différents de [A-Z] au début d'une chaîne de caractères. Par exemple "3, chemin de la Fontaine" doit donner "Fontaine".
Une idée pour faire ça en SQL de façon compatible avec MySQL 5.6.28 ?
Merci de votre aide
Salut,

Plusieurs questions pour essayer de clarifier la demande :
- Qu'essayes-tu de faire ? Pourquoi vouloir extraire "Fontaine" de l'adresse ?
- Qu'est-ce qui te garantie que les majuscules se trouveront toujours là où tu veux ?
- Dans l'exemple que tu donnes, il y a d'autres caractères que des majuscules. Sais-tu construire une regexp qui extraie Fontaine de "3, chemin de la Fontaine" ? Tu peux t'entrainer là : https://regex101.com/
- Pourquoi faire ce traitement en SQL ? Surtout si l'outil n'est pas adapté.
Merci de ta réponse
Cette adresse n’est qu’un exemple : elle contient des chiffres une virgule des espaces et des lettres minuscules avant la première majuscule.
En pratique j’applique ça à des noms de compositeurs je veux les classer par ordre alphabétique en enlevant les particules
Tomas Luis de Victoria doit être classé à la lettre V et pas à la lettre d
Actuellement je fais ça en PHP

$lname = preg_replace("/^[^A-Z]*/", $lastName);

Je retrouve la liste des compositeurs par SQL et j’aurais aimé trier les noms par ORDER BY
Modérateur
Bonjour,

Si le nombre des particules possibles est relativement limité, tu peux envisager l'instruction mysql TRIM.

Amicalement,
Merci de cette suggestion
Autant que je comprenne si je veux supprimer les particules françaises ("de", "d'", "du" "de la") il faut 4 TRIM imbriqués. De plus je me rends compte que (sauf à tout chambouler dans la base) ça va aussi me supprimer les mêmes en majuscule car la table est définie en utf8_general_ci, il faudrait la passer en uft8_bin,
Un peu complexe pour quelqu'un qui n'est pas très à l'aise avec ces choses Smiley rolleyes
Tant pis, je vais garder mon tri en SQL, il n'y a que 217 auteurs pour le moment, ça montera difficilement à plus de 300, c'est tolérable.
Modérateur
Bonjour,

Oui, il faudrait des TRIM imbriquées.

Pour ce qui est du problème des majuscules/minuscules, tu peux peut-être t'en sortir en utilisant l'instruction COLLATE.

Un bon exercice ! Smiley biggrin

Amicalement,
Ouais... pas tenté de faire cette expérience, d'autant que pour le moment mon serveur ne peut plus accéder à la base de données depuis une heure (erreur 2013). Smiley confus Smiley fache Smiley sweatdrop Smiley biggol Smiley hum
Tes contraintes limitent grandement les solutions possibles. Dans ces conditions, je créerais une nouvelle colonne contenant le nom extrait en faisant le traitement en PHP pour remplir les champs.
C’est effectivement une façon efficace de traiter le problème mais je n’aime pas beaucoup par principe stocker les données en double alors qu’il existe un algorithme simple pour extraire une forme de l’autre. Tant qu’à faire un bout de code autant le faire au moment où on en a besoin (la lecture dans le cas où on veut faire un classement alphabétique) il y a plein de cas dans lesquels ce classement n’est pas utile.