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

SQL Oracle Discussion :

Utilisation de chaines litéralles non interprétées dans un regexp_like


Sujet :

SQL Oracle

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 281
    Points
    281
    Par défaut Utilisation de chaines litéralles non interprétées dans un regexp_like
    Bonjour,

    J'utilise la fonction regexp_like dans une requête SQL pour rechercher dans une table des lignes dont un champ a une certaine forme. Cela marche bien.
    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Table T_FORET(ESPECE varchar2(50), APPELLATION varchar2(80)) (('platane', 'Arbre platane'), ('platane jaune', 'Arbre platane jaune'), ('assimilé platane', 'Arbre assimilé platane'), ('chene(noble)', 'Arbre chene(noble)'))...
     
    select * from T_FORET where regexp_like (APPELLATION , 'platane');
    Ca marche bien et je retrouve mes platanes.

    Je complexifie en utilisant un champ dans l'expression régulière. Je veux que l'appellation commence par "Arbre", suivi de l'ESPECE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from t_foret where regexp_like (APPELLATION , '^Arbre '||ESPECE );
    Et là pour les platanes ça marche mais pas pour le 'chene(noble)' car la parenthèse "(" dans le champ ESPECE est interprété par la fonction regexp_like.

    Pour une seule lettre je peux utiliser le "\" pour éviter l'interprétation et prendre un "(" littéralement en cherchant "\(".
    Ma question est:
    Dans l'expression régulière '^Arbre '||ESPECE y-a-t-il moyen que le champ ESPECE ne soit pas traité par regexp_like comme expression régulière mais comme un littéral non interprété ?
    J'ai essayé de l'enclore avec des ", ', { à tout hasard mais en vain.

    Si cela parle à quelqu'un...
    Pozzo

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 156
    Points : 1 944
    Points
    1 944
    Par défaut
    Bonjour,

    Si tu ne peux avoir que des parenthèses éventuellement, tu peux les remplacer en les précédents d'un oblique. Quelque chose du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from t_foret where regexp_like (APPELLATION , '^Arbre '|| replace(replace(ESPECE, '(', '\('), ')', '\)'));

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 281
    Points
    281
    Par défaut
    Merci vanagreg de t'intéresser à ma question.

    Faire du replace est en effet une solution mais je ne l'envisage qu'en dernière extrémité car
    1. Il peut y avoir n'importe quoi et ça ferait faire du replace(replace(replace...
    2. J'aimerais une solution plus élégante et ça me sidèrerait qu'il n'y ai pas possibilité d'enclore une partie d'une chaine pour qu'elle ne soit pas interprétée (même si je ne suis jamais tombé dessus)

    Si cela était le cas je tenterais quelque chose qui ressemble à ce que tu suggères, en utilisant le regexp_replace pour supprimer les caractères de la classe ponctuation d'un coup.
    Au pire je pourrais bricoler la chaine dans une fonction plsql, les performances n'étant pas un enjeu fort dans mon contexte (la forêt pousse lentement )

    Voyons si quelqu'un trouve mieux...

    Pozzo

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 156
    Points : 1 944
    Points
    1 944
    Par défaut
    Ok, si tu veux échapper tous les caractères spéciaux, tu peux faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from t_foret where regexp_like (APPELLATION , '^Arbre '|| REGEXP_REPLACE(ESPECE, '([][)(}{.$*+?,|^\])', '\\\1'));

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/10/2009, 19h40
  2. Réponses: 1
    Dernier message: 25/09/2009, 12h03
  3. PHP non interprété dans un fichier XML
    Par Peyothe dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 03/06/2009, 20h43
  4. HTML non interprété dans lien
    Par kangaxx dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 07/04/2008, 09h51
  5. [phpBB] Code PHP non interprété dans un thème subsilver
    Par killpilot dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 24/06/2007, 11h42

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