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 :

[SQL] Retrouver un mot complet dans une chaine


Sujet :

SQL Oracle

  1. #1
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 309
    Points : 1 385
    Points
    1 385
    Par défaut [SQL] Retrouver un mot complet dans une chaine
    On me demande de faire une recherche sur un mot complet (séparé des autres mots par un espace, un tiret, une apostrophe, un slash ou un guillemet). Petit exemple pour être clair :
    Contenu du champ prenom de la table client :
    YANN
    YANNICK
    YANN-LOIC
    YANNIS
    JEAN YANN
    TRYANN

    Ma recherche sur "YANN" doit me retourner :
    YANN
    YANN-LOIC
    JEAN YANN

    A part faire quelque chose de très lourd comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select distinct prenom from client where prenom = 'YANN' 
    OR prenom like '% YANN %' OR prenom like 'YANN %' OR prenom like '% YANN'
    OR prenom like '%-YANN-%' OR prenom like 'YANN-%' OR prenom like '%-YANN'
    OR...
    je ne vois pas.

    Existe-t-il une manière plus élégante et plus performante pour arriver au même résultat ?

  2. #2
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    Salut,

    Quelle est ta version d'oracle ?

  3. #3
    Membre averti Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 342
    Points
    342
    Par défaut
    je ferais tous simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select distinct prenom from client where prenom  like '%YANN%'
    .

    LBO72.

  4. #4
    Membre averti Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 342
    Points
    342
    Par défaut
    Autant pour moi....
    Avec ma requête YANNICK sortira aussi...
    Je continue la réfelexion.

  5. #5
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    Citation Envoyé par LBO72 Voir le message
    je ferais tous simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select distinct prenom from client where prenom  like '%YANN%'
    .

    LBO72.
    Ça marche pas, voir l'exemple qu'il a donné:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    On me demande de faire une recherche sur un mot complet (séparé des autres mots par un espace, un tiret, une apostrophe, un slash ou un guillemet). Petit exemple pour être clair :
    Contenu du champ prenom de la table client :
    YANN
    YANNICK
    YANN-LOIC
    YANNIS
    JEAN YANN
    TRYANN
     
    Ma recherche sur "YANN" doit me retourner :
    YANN
    YANN-LOIC
    JEAN YANN

  6. #6
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    Salut,

    Si tu as la version 10g, tu peux voir du coté des expressions regulières.

    http://www.oracle.com/technology/ora...egexp_pt1.html

  7. #7
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 309
    Points : 1 385
    Points
    1 385
    Par défaut
    C'est une version 9.

  8. #8
    Invité
    Invité(e)
    Par défaut
    et avec translate, y aurait pas des possibilités de jouer avec les caractères qui te dérangent.
    Et soundex - je lance l'idée parce que je ne connais pas plus que ça...

  9. #9
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 309
    Points : 1 385
    Points
    1 385
    Par défaut
    Soundex, non. Le client veut utiliser le nom véritable.
    Translate, je regarde comment ça marche.

  10. #10
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par Christophe P. Voir le message

    A part faire quelque chose de très lourd comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select distinct prenom from client where prenom = 'YANN' 
    OR prenom like '% YANN %' OR prenom like 'YANN %' OR prenom like '% YANN'
    OR prenom like '%-YANN-%' OR prenom like 'YANN-%' OR prenom like '%-YANN'
    OR...
    je ne vois pas.

    Existe-t-il une manière plus élégante et plus performante pour arriver au même résultat ?
    Moi je trouve ça très bien, tu définis précisement tous les cas que tu veux couvrir

  11. #11
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    eventuellement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where '-'||replace(nom,' ','-')||'-' like '%-YANN-%'

  12. #12
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    pour la performance, tu peux tenter

    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
     
    create table t as (select 'YANN' nom from dual union all
    select 'YANNICK' from dual union all
    select 'YANN-LOIC' from dual union all
    select 'YANNIS' from dual union all
    select 'JEAN YANN' from dual union all
    select 'FRANC' from dual union all
    select 'TRYANN' from dual);
     
    create [bitmap] index i on
       t(sign(instr('-'||replace(nom,' ','-')||'-' ,'-YANN-')));
     
    select nom
    from t
    where sign(instr('-'||replace(nom,' ','-')||'-' ,'-YANN-')) = 1;

  13. #13
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    note que tu peux atteindre la même performance avec ton like

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    create index i on t(
    case when nom = 'YANN' or nom like 'YANN-%'
    or nom like 'YANN %' or nom like '% YANN'
    or nom like '%-YANN' then 1 end );
     
    select nom
    from t
    where case when nom = 'YANN' or nom like 'YANN-%'
    or nom like 'YANN %' or nom like '% YANN'
    or nom like '%-YANN' then 1 end is not null;

  14. #14
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 309
    Points : 1 385
    Points
    1 385
    Par défaut
    Merci. Je vais regarder tout ça en détail.

  15. #15
    Membre averti Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 342
    Points
    342
    Par défaut
    Salut Laurent,

    Ouaw !! ta solution à l'air d'un vrai casse tête
    En quoi est-elle plus performante ?

    Je trouve ta première solution plus lisible et plus claire.
    Laurent :
    where '-'||replace(nom,' ','-')||'-' like '%-YANN-%'

  16. #16
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    parceque je peux créer un index sur la fonction

  17. #17
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    create table t as select object_name nom from all_objects;
    insert into t values ('LOIC-YANN');
    commit;
    exec dbms_stats.gather_table_stats(user,'T')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select * from t where '-'||replace(nom,' ','-')||'-' like '%-YANN-%';
    NOM
    ------------------------------
    LOIC-YANN
    --------------------------------------------------------------------------
    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |      |  2714 | 67850 |    73   (3)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| T    |  2714 | 67850 |    73   (3)| 00:00:01 |
    --------------------------------------------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    create index i on t(
    case when nom = 'YANN' or nom like 'YANN-%'
    or nom like 'YANN %' or nom like '% YANN'
    or nom like '%-YANN' then 1 end );
    exec dbms_stats.gather_index_stats(user,'I')
    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
    16
     
    select nom
    from t
    where case when nom = 'YANN' or nom like 'YANN-%'
    or nom like 'YANN %' or nom like '% YANN'
    or nom like '%-YANN' then 1 end is not null;
    NOM
    ------------------------------
    LOIC-YANN
    ------------------------------------------------------------------------------------
    | Id  | Operation                   | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT            |      |     1 |    25 |     2   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS BY INDEX ROWID| T    |     1 |    25 |     2   (0)| 00:00:01 |
    |*  2 |   INDEX FULL SCAN           | I    |     1 |       |     1   (0)| 00:00:01 |
    ------------------------------------------------------------------------------------

  18. #18
    Membre averti Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 342
    Points
    342
    Par défaut
    Effectivement

    Ta segonde solution est plus performante, puisque dans la première on fait un full scan de la table

    Merci.
    LBO72.

  19. #19
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    oui, mais il faut créer l'index, et si l'on exécute cette requête qu'une seule fois pour YANN, ça ne vaut pas la peine

  20. #20
    Membre averti Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 342
    Points
    342
    Par défaut
    Laurent,

    Comment est-ce que tu arrives pour afficher ton plan d'exécution avec ta requête ? est-ce que c'est en affichant le Plan_Table ? , en activant les traces ?...

    Si tu as script tout prêt, je suis preneur

    Merci.
    LBO72.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [RegEx] preg_match : recherche d´un mot entier dans une chaine
    Par iOops dans le forum Langage
    Réponses: 7
    Dernier message: 04/04/2011, 16h34
  2. [Sql Server] Fonction de recherche dans une chaine
    Par pierre031183 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/01/2011, 17h16
  3. Réponses: 2
    Dernier message: 28/03/2008, 19h24
  4. Retrouver un mot entier dans un chaine (même en bout)
    Par Christophe P. dans le forum SQL
    Réponses: 5
    Dernier message: 06/03/2008, 11h33
  5. [RegEx] Trouver certains mots entre [] dans une chaine de caractères
    Par Prosis dans le forum Langage
    Réponses: 3
    Dernier message: 22/10/2007, 22h52

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