Page 1 sur 1

LIKE avec des chiffres ?

Posté : 27 avr. 2005, 22:35
par Franquito
Bonsoir à tous ;)

J'aurai voulu savoir s'il était possible d'utiliser LIKE dans une requete SQL mais uniquement pour des chiffres ?

par exemple comme 'LIKE AOCB%' mais cette fois ci le % remplacerais une chaine de numéro comme "0315" ou bien "6" voir "12"...

De fait je pourrai selectionner :
AOCB0315
AOCB6
AOCB12

Mais pas :
AOCBSY6

Voyez vous une solution ? [0-9999] comme sous linux ?

Posté : 27 avr. 2005, 22:37
par pjl
regarde du coté des expressions régulières.
par contre, je ne suis pas sur que toutes les versions de BDD les acceptent.

Posté : 27 avr. 2005, 22:38
par Cyrano
Avec LIKE, je ne suis pas certain, mais avec REGEXP sûrement

Posté : 27 avr. 2005, 22:45
par albat
Si ton champ est déclaré dans un type chaîne de caractères,
tu dois pouvoir utiliser l'instruction LIKE sans problèmes.
SELECT * FROM table WHERE champ LIKE "%123%"
devrait te retourner la valeur ABC123DEF

Posté : 27 avr. 2005, 22:47
par pjl
Mais ca lui ramènera cette valeur AOCBSY6 qu'il ne veut pas.

Re: LIKE avec des chiffres ?

Posté : 28 avr. 2005, 09:07
par Ripat
Voyez vous une solution ? [0-9999] comme sous linux ?
Oui. Mais, même sous Linux, la classe [0-9999] n'existe pas. :wink:

Code : Tout sélectionner

SELECT * FROM `table` WHERE col1 REGEXP '^AOCB[0-9]+$'
Si on répugne à utiliser les expressions régulières on devrait pouvoir s'en tirer avec CAST->SUBSTRING et faire une comparaison sur la valeur retournée, mais c'est vraiment tordu. Pas recommandé non plus côté perfo.

Contrairement à leur réputation, les regex sont performantes lorsque utilisées à bon escient. D'autant plus que le moteur regex de MySQL, comme celui d'egrep de Linux ou de awk, est du type DFA (Deterministic Finite Automation) beaucoup plus simple, moins riche que les regex PHP mais encore plus rapide.

Posté : 28 avr. 2005, 10:35
par albat
Mais ca lui ramènera cette valeur AOCBSY6 qu'il ne veut pas.
Au temps pour moi, j'avais mal compris la question. :oops:
À la relecture, je n'ai pas d'autre idée que les regexp effectivement.

Posté : 28 avr. 2005, 21:47
par Franquito
Merci les gars, j'ai finalement opté pour les expressions règulières, ca marche niquel.

Encore Merci :)

Posté : 02 mai 2005, 09:45
par Franquito
Avant de mettrre le [resolu] dans le titre, j'aurai voulu savoir si l'ont peut faire l'inverse ? c'est a dire retirer les derniers numéro de la chaine ?

Par exemple :

AOCB6 => AOCB
VDPSY5 => VDPSY
VDPB12 => VDPV

Merci d'avance :)

Posté : 02 mai 2005, 09:48
par Cyrano
En utilisant la fonction trim(), ça devrait pouvoir se faire.

Posté : 02 mai 2005, 10:20
par albat
moi, je pense plutôt à un str_replace()
for ($i=0 ; $i<9 ; $i++)
    $chaine = str_replace("'".$i."'", "", $chaine);

Posté : 02 mai 2005, 11:12
par Franquito
J'ai finalement opté pour :

Code : Tout sélectionner

$mask = '`([A-Z]+)([0-9]+)`'; $vins = preg_replace($mask, '$1' , $ref);
Merci a tous