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

Développement SQL Server Discussion :

Requête avec LIKE et expression regulière [2008R2]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut Requête avec LIKE et expression regulière
    Bonjour

    J'ai une table avec une colonne TEXT qui contient des chaînes de caractères plus ou moins longues.
    Je dois sélectionner toutes les lignes pour lesquelles la valeur commence par une parenthèse ouvrante et se termine par ' import)', et ne contenant aucune parenthèse à l'intérieur. Typiquement:
    (Bonjour (machin) import)
    ne doit pas être sélectionné.

    J'ai écrit le SQL suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    WITH S (R)
    AS
    (
        SELECT Cast(notes AS VARCHAR(1000)) R
        FROM catalogue
    	WHERE  Cast(notes AS VARCHAR(1000)) LIKE '(% import)' 
    )
    	SELECT COUNT(R), R
    	FROM   S
    	WHERE  
                R LIKE '([^(]% import)' AND 
    	    R LIKE '([^)]% import)'
    	GROUP  BY R 
    GO
    Malheureusement, si la requête ne présente pas d'erreur, elle me retourne des lignes incorrectes avec des parenthèses en milieu de chaîne.

    Quelqu'un pourrait-il me dire où est l'erreur svp ??

    Papy !

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Essayez ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    WITH S (R)
    AS
    (
        SELECT Cast(notes AS VARCHAR(1000)) R
        FROM catalogue
    )
    	SELECT COUNT(R), R
    	FROM   S
    	WHERE  
                R LIKE '(%import)' 
    	    AND  R NOT LIKE '(%[()]%)'
    	GROUP  BY R

  3. #3
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    Trop fort !



    ps: Je vais analyser ça pour mieux comprendre mon erreur

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    en fait, dans votre dernière requête, vous ne filtrez que les lignes dont le deuxième caractère est différent de "(" et différent de ")".

  5. #5
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    en fait, dans votre dernière requête, vous ne filtrez que les lignes dont le deuxième caractère est différent de "(" et différent de ")".

    et donc, si j'ai bien compris, [()]% veut dire qu'il peut y avoir l'une ou l'autre parenthèse, mais pas forcément dans l'ordre indiqué.

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    et donc, si j'ai bien compris, [()]% veut dire qu'il peut y avoir l'une ou l'autre parenthèse, mais pas forcément dans l'ordre indiqué.
    pas tout à fait :
    Ci dessous le filtre avec des commentaires :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    WHERE  
        R LIKE '(%import)' --> Ne garde que les lignes commençant par "(" et finissant par "import)"
        AND R NOT LIKE '(%[()]%import)' --> ne garde pas les lignes qui commencent par "(", finissent par "import)" et contiennent soit"(" soit ")" au milieu
    Notez le NOT LIKE

  7. #7
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    Finalement, une question complémentaire: Est-ce que je peux faire un DELETE comme ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    WITH S (R) AS 
    (
    	SELECT Cast(notes AS VARCHAR(1000)) R
    	FROM   catalogue
    )
    DELETE
    FROM   S
    WHERE  R LIKE '(%import)'
           AND R NOT LIKE '(%[()]%import)'

    ....

    Je crois que j'ai écris une grosse bétise là.
    Il faut que je supprime dans catalogue et non dans S

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    oui, vous pouvez.

    Notez que le type TEXT est déprécié, remplacé par VARCHAR(MAX). Vous pourriez prévoir de modifier cette colonne de la table afin de ne plus être obligé de transtyper.

  9. #9
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    oui, vous pouvez.

    Notez que le type TEXT est déprécié, remplacé par VARCHAR(MAX). Vous pourriez prévoir de modifier cette colonne de la table afin de ne plus être obligé de transtyper.
    Là, j'ai peur que ça ait trop d'influence sur le code Delphi qui utilise la base.

    Mais je retiens le conseil pour les nouvelles tables qui pourraient être créées.

    Merci .

  10. #10
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Citation Envoyé par Papy214 Voir le message

    ....

    Je crois que j'ai écris une grosse bétise là.
    Il faut que je supprime dans catalogue et non dans S
    Non, c'est bon ! S n'est qu'un alias pour la sous requete, c'est donc bien dans Catalogue que les lignes seront supprimées.

    Cela fonctionnerait de la même façon si S était une vue reprenant votre requête.

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

Discussions similaires

  1. Optimiser ma requète avec like
    Par vb dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 06/11/2008, 15h45
  2. requête avec LIKE et IN ensemble
    Par mdr_cedrick dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/03/2008, 11h02
  3. Pb Requête avec Like
    Par Syrrus dans le forum VBA Access
    Réponses: 7
    Dernier message: 21/11/2007, 17h34
  4. [Débutant] Requête avec Like
    Par nellynew dans le forum Access
    Réponses: 3
    Dernier message: 27/09/2006, 07h30
  5. Requête avec like et un champ de formulaire
    Par Sly2k dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 31/07/2006, 15h46

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