IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Trouver une valeur parmi une liste de valeurs ? [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2019
    Messages : 14
    Par défaut Trouver une valeur parmi une liste de valeurs ?
    Bonjour,

    dans un champ SQL - appelons le CHAMP_A -, sont stockés des identifiants numériques sous la forme d'une liste d'entiers séparés par des virgules.
    Ces champs peuvent stocker une ou plusieurs valeurs (uniques).
    Par ex.
    - un tel champ pourrait contenir : "1,12,21,131,234,28" (cas 1)
    - ou bien : "45,121,35"
    - ou bien : "12,24" (cas 3)
    - ou bien : "32,12" (cas 4)
    - ou bien juste : "12" (cas 5)

    Je cherche à faire un test qui trouverait les enregistrements dont le champ CHAMP_A contient tel ou tel identifiant.
    Par ex. je veux trouver les enregistrements dont le CHAMP_A contient la valeur "12"
    Le problème est de trouver la bonne expression régulière qui permette de retourner le résultat voulu : cela suppose de gérer tous les cas possibles (où l'entier recherché est au début, à la fin, tout seul, parmi d'autres d'autres valeurs) et aussi d'exclure les cas où le nombre cherché est une partie d'autres nombres (par ex. la chaine "12" est contenue dans la chaine "121").

    Pour les 5 cas pris en ex. ci-dessus :
    - le cas 1 doit matcher / correspondre (car il y a bien le nombre 12 parmi les valeurs)
    - le cas 3 doit matcher (12 est en début de chaine)
    - le cas 4 doit matcher (12 est en fin de chaine)
    - le cas 5 doit matcher (même si 12 est la seule valeur)
    - MAIS le cas 2 ne doit PAS matcher (car 121, ce n'est pas 12)

    Je n'arrive pas à construire la bonne regex pour cela.
    Pour l'instant j'utilise celle-ci (/,?12,?/), mais le problème est qu'elle retourne 121 si l'on cherche 12...

    Merci d'avance pour vos conseils et pistes.

    JG

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1- une solution :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE CONCAT(',',CHAMP_A,',') REGEXP '/,12,/'
    On ajoute une virgule au début et à la fin, avant la comparaison.

    2- une meilleure solution : on utilise une table de correspondance (puis une JOINTURE)

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2019
    Messages : 14
    Par défaut
    Merci beaucoup pour votre réponse : je n'avais pas pensé à ce genre de contournement !.
    Je suis bien d'accord qu'une jointure serait préférable, mais je n'ai pas la main sur la structure de la base.

    Pour faire la même chose, on m'a suggéré par ailleurs une regexp : Je ne suis pas sûr de bien la comprendre, mais ça a tout l'air de fonctionner.

    JG

  4. #4
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    3 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 3 020
    Par défaut
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
     WHERE CHAMP_A REGEXP '\\b12\\b'

    Tu veux que 12 ne touche pas d'autres chiffres et à part des nombres ta colonne ne contient que des virgules, donc tu peut utiliser un word-boundary \b.
    Il n'y a pas de délimiteurs de pattern en SQL donc on ne met pas de slashes autour. Le quantificateur {1} ne sert à rien (toujours et quelque soit la pattern), car chaque élément inscrit dans une pattern y est une fois par défaut.

    Tu dois pouvoir aussi utiliser find_in_set():
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
     WHERE FIND_IN_SET('12', CHAMP_A)>0

    2- une meilleure solution : on utilise une table de correspondance (puis une JOINTURE)
    C'est clairement ce qu'il y a de mieux à faire.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2019
    Messages : 14
    Par défaut
    Merci pour ces informations complémentaires et l'option FIND_IN_SET.
    JG

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 18
    Dernier message: 12/09/2010, 18h27
  2. [Batch] Où trouver une liste exhaustive descommandes externes ?
    Par NorocBzh dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 28/05/2009, 19h35
  3. Où trouver une liste exhaustive de VCL?
    Par hsazerty dans le forum C++Builder
    Réponses: 1
    Dernier message: 24/04/2007, 20h37
  4. [serieux]où trouver une liste de ville?
    Par bourvil dans le forum Autres Logiciels
    Réponses: 10
    Dernier message: 30/05/2006, 12h15
  5. [WebService]Ou trouver une liste de fichier WSDL?
    Par javazer dans le forum Services Web
    Réponses: 6
    Dernier message: 07/04/2006, 14h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo