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 SQL Discussion :

Sélection d'éléments avec wildcards


Sujet :

Langage SQL

  1. #1
    Invité
    Invité(e)
    Par défaut Sélection d'éléments avec wildcards
    Bonjour,

    J'ai une table resource ( varchar(125) url ) pour laquelle les urls peuvent contenir une astérisque et dont je dois extraire toutes les url qui correspondent à ma demande.

    Par exemple, j'ai dans ma table les urls suivantes : "*.css, *.js, home.html, private/test.html, private/*.do" et je reçois la chaîne suivant : "test.css" et je devrais récupèrer "*.css" (plus les infos qui vont avec et que je ne vous ai pas mis)

    Mais je ne vois pas du tout comment faire ce genre de choses simplement... L'un d'entre vous à t'il une idée/piste/solution ?

    Merci


    Edit :
    Pardon SQLPro de ne pas avoir respecté votre charte.

    Le conetxte : Ma table resources contient des urls qui liées par un table de relations à différentes rôles. Lorsqu'un utilisateur tente d'accéder à une page web, je récupère ces rôles et voudrais récupèrer les urls accessibles par ces rôles. Pour éviter d'avoir à encoder chaque url dans ma table, je veux utiliser des wildcards.

    Sgbdr : Sans Importance. Actuellement PostgreSQL mais je dois rester indépendant du sgbr (ma requête seras exécuté via Hibernate)

    Table(s) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE resources (
      url CHARACTER VARYING(125) NOT NULL,
      description CHARCATER VARYING(255),
      CONSTRAINT pk_resources PRIMARY KEY (url)
    );
    INSERT INTO resources (url, description) VALUES ('*.css', 'Feuilles de styles');
    INSERT INTO resources (url, description) VALUES ('*.js', 'Scripts clients');
    INSERT INTO resources (url, description) VALUES ('home.htm', 'Page de démarrage');
    INSERT INTO resources (url, description) VALUES ('private/test.html', '');
    INSERT INTO resources (url, description) VALUES ('private/*.do', '');
     
    -- La table de relation, tout comme la table des rôles n'ont aucun intérêt
    -- je ne les ai donc pas décrites.
    Ce que je voudrais obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    -- Le résultat attendu pour une requête sur 'main.css' (sans la jointure)
    url           description
    ------------- -------------
    *.css         Feuilles de styles
     
    -- Le résultat attendu pour une requête sur 'private/additem.do' (sans la jointure)
    url           description
    ------------- -------------
    private/*.do
    Dernière modification par Invité ; 05/06/2008 à 09h14.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 042
    Billets dans le blog
    6
    Par défaut
    DONNEZ UN EXEMPLE CONCRET !
    RESPECTEZ LA CHARTE DE POSTAGE :
    http://www.developpez.net/forums/ann....php?f=37&a=69

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    [Sans remettre en cause la directive de SQLPro]
    En gros, tu voudrais matcher une URL avec un format d'URL stockée dans la table ?

    On pourrait imagine un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT *
    FROM TaTable T
    WHERE 'MonUrl' like T.url
    Le problème, c'est que les jokers ne sont pas les même... (* contre %)
    Qu'à cela ne tienne !
    Il y a une chance que ton SGBD te propose une fonction de conversion de caractères. TRANSLATE, REPLACE, ...
    Disons que t'es sous Oracle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT *
    FROM TaTable T
    WHERE 'MonUrl' like translate(T.url, '*', '%')
    Ca peut correspondre à ce que tu cherches à faire ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Oui, c'est tout à fais ça que je cherchais. Mais je ne pensais pas que le fait d'insérer un '%' dans la table sois interprèté tel quel.
    'On' m'avais conseillé de le faire côté applicatif .. mais c'est bien plus p^ropre comme ça.

    Merci beaucoup.
    Et merci à SQLPro qui m'a fais compléter ma demande et permis d'obtenir une si bonne réponse si vite.

  5. #5
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    En fait, le fait que le '%' soit "dans la table" ne change rien : les conditions évaluées le sont toujours sur des expressions, et tous les opérateurs et fonctions s'appliquent sur des expressions typées...

    Par rapport à la portabilité, il faut quand même préciser que le translate n'est pas implémenté partout, même s'il est dans la norme SQL.

    J'en profite pour faire la pub pour un article que je trouve génial :
    http://sqlpro.developpez.com/cours/sqlaz/fonctions/

    (Vous remarquerez que c'est encore un coup de SQLpro )

  6. #6
    Invité
    Invité(e)
    Par défaut
    Oui, merci à SQLPro, vraiment.

    Par contre je "dé résoud" mon post car il y à un "effet de bord" à ma requête :
    Si j'insère ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO resources (url) VALUES ('private/*.do');
    INSERT INTO resources (url) VALUES ('private/test/*.do');
    Le résultat de la requête est le suivant pour la chaine 'private/test/plop.do' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    url               description
    ----------------- -----------
    private/*.do
    private/test/*.do
    L'idéal serais de pouvoir afficher celui qui correspond le plus (le derbier) MAIS il est possible qu'un jour, l'astérisque se trouve au début de l'url ou même qu'il y en ai plusieurs (début, milieu, fin) mais je crains d'en demander un peu trop.

  7. #7
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    C'est le plus long qu'il te faut.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ORDER BY CHAR_LENGTH(url) DESC
    LIMIT 1

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

Discussions similaires

  1. [HQL] Query avec sélection des éléments de deux classes composites
    Par EtudiantJ2EE dans le forum Hibernate
    Réponses: 4
    Dernier message: 02/03/2012, 10h33
  2. Réponses: 5
    Dernier message: 03/03/2009, 09h47
  3. [DOM] Insertion d'éléments avec DOM
    Par TheReturnOfMuton dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 27/06/2006, 15h33
  4. Compter nombre d'éléments avec valeur X dans un formulaire
    Par p0Kep0K dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 24/11/2005, 15h49
  5. Sélection multi table avec condition
    Par iuz dans le forum Langage SQL
    Réponses: 8
    Dernier message: 05/05/2004, 15h04

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