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 :

Alternative au like avec des or


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 79
    Points : 54
    Points
    54
    Par défaut Alternative au like avec des or
    Bonjour.

    Je cherche à faire la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select ligne from table where ligne like '%chaine1%' or ligne like '%chaine2%';
    mais de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select ligne from table where ligne like any ('%chaine1%','%chaine2%');
    Le soucis que j'ai c'est que j'ai beaucoup de "or", ça peut être 0 comme 100.
    Le like any n'existe pas chez oracle mais peut être y a t'il un autre moyen ? Est ce que le contain ferait l'affaire ? (je ne connais pas le fonctionnement du contain).
    Je ne peux pas non plus utiliser les expressions régulière.

    les chaines chaine1 et chaine2 sont issu d'une requête portant sur une autre table (je ne peux pas faire de jointure, le modèle est foireux :'( ), je peux peut-être aussi utiliser directement cette requête ? mais avec un like je sais pas trop comment ça marche...

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Quelque chose comme ça (ou avec InStr comme il aime MCM)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    With Data As (
      Select 'James' as modele from dual union all
      Select 'Steven'  as modele from dual union all
      Select 'Da'  as modele from dual 
    )
    Select *
      from hr.employees t
           Join
           Data d
        On t.first_name like '%'||d.modele||'%'

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Mais où est mon INSTR ?

    Il faudrait préciser comment se matérialisent les chainesX ? des variables, une variable, une colonne issue d'une requête, plusieurs colonnes ?
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Ce genre de requête avec des wildcard like % en début de host variable va prendre un temps considérable sur une table avec un volume significatif
    Il ne faut pas oublier qu'un % en début rend la requête non indexable (non "sargable")
    ceci combiné avec jusqu'à 100 or ça va être une véritable catastrophe

    A fuir comme la peste !

    Pour ce genre de recherches, si la table est volumineuse, il faut utiliser des index full text et les recherches correspondantes

  5. #5
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut regexp_like
    Bonjour,
    Il faudrait utiliser une expression régulière, comme REGEXP_LIKE(...,'chaine(1|2)')
    Cordialement,
    Franck.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  6. #6
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par pachot Voir le message
    ...
    Il faudrait utiliser une expression régulière, comme REGEXP_LIKE(...,'chaine(1|2)')
    ...
    Je ne peux pas non plus utiliser les expressions régulière
    ...

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Ce genre de requête avec des wildcard like % en début de host variable va prendre un temps considérable sur une table avec un volume significatif
    Il ne faut pas oublier qu'un % en début rend la requête non indexable (non "sargable")
    ceci combiné avec jusqu'à 100 or ça va être une véritable catastrophe
    Oui, non, peut-être, ça dépend.
    Difficile d'être affirmatif dans ce genre de cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select count(*)
      from une_table
     where une_colonne like '%BC%';
     
      COUNT(*)
    ----------
      82486278 
     
    Elapsed: 00:00:26.690
    Et pourtant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select num_rows
         , round(blocks * 32767 / power(1024, 3), 3) as bytes_go
      from user_tables
     where table_name = 'UNE_TABLE';
     
      NUM_ROWS   BYTES_GO
    ---------- ----------
     770000000     35,666
    26 secondes pour compter 82 millions de lignes sur 770 millions, ça ne m'apparaît pas être considérable.

Discussions similaires

  1. Réponses: 6
    Dernier message: 14/08/2013, 12h21
  2. Réponses: 2
    Dernier message: 03/12/2008, 17h46
  3. Requete avec LIKE sur du texte avec des slash
    Par mkaffel dans le forum Requêtes
    Réponses: 4
    Dernier message: 18/12/2007, 12h07
  4. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

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