[RESOLU] LIKE avec des chiffres ?

Franquito
Invité n'ayant pas de compte PHPfrance

27 avr. 2005, 22:35

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 ?

ViPHP
pjl
ViPHP | 2119 Messages

27 avr. 2005, 22:37

regarde du coté des expressions régulières.
par contre, je ne suis pas sur que toutes les versions de BDD les acceptent.

Mammouth du PHP | 19672 Messages

27 avr. 2005, 22:38

Avec LIKE, je ne suis pas certain, mais avec REGEXP sûrement
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

27 avr. 2005, 22:45

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

ViPHP
pjl
ViPHP | 2119 Messages

27 avr. 2005, 22:47

Mais ca lui ramènera cette valeur AOCBSY6 qu'il ne veut pas.

ViPHP
ViPHP | 1380 Messages

28 avr. 2005, 09:07

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.
ripat

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

28 avr. 2005, 10:35

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.

Franquito
Invité n'ayant pas de compte PHPfrance

28 avr. 2005, 21:47

Merci les gars, j'ai finalement opté pour les expressions règulières, ca marche niquel.

Encore Merci :)

Franquito
Invité n'ayant pas de compte PHPfrance

02 mai 2005, 09:45

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 :)

Mammouth du PHP | 19672 Messages

02 mai 2005, 09:48

En utilisant la fonction trim(), ça devrait pouvoir se faire.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

02 mai 2005, 10:20

moi, je pense plutôt à un str_replace()
for ($i=0 ; $i<9 ; $i++)
    $chaine = str_replace("'".$i."'", "", $chaine);

Franquito
Invité n'ayant pas de compte PHPfrance

02 mai 2005, 11:12

J'ai finalement opté pour :

Code : Tout sélectionner

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