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 :

Expression régulière dans requête SELECT ?


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2002
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 152
    Points : 94
    Points
    94
    Par défaut Expression régulière dans requête SELECT ?
    Bonjour à tous,

    Voici mon problème :

    J'ai une table LETTRES contenant une colonne DESTINATAIRES de type VARCHAR. Cette colonne DESTINATAIRES recense donc les identifiants (colonne ID dans la table DESTINATAIRES) des destinataires auxquels a été envoyé une lettre, séparés par des point-virgules, par exemple 1;5;18;25;32
    L'exemple indique donc que la lettre en question a été envoyée aux destinataires d'identifiants 1, 5, 18, 25 et 32.

    La question :
    Comment faire pour écrire une requête SELECT permettant par exemple de retourner les identifiants des lettres (colonne ID dans la table LETTRES) qui ont été envoyées au contact d'identifiant 25 ?

    Du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id FROM lettres WHERE destinataires=25

    Le problème c'est que j'ai des VARCHAR d'identifiants séparés par des point-virgules...

    Merci d'avance pour votre aide !

    P.s. : pour info, j'utilise une base de données Apache Derby.
    </aliasjcdenton>

    "Un Homme devient vieux lorsque ses regrets prennent la place de ses rêves"

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Ta question démontre avant tout que la structure de ta base de données n'est pas normalisée.
    On ne gère pas une liste dans une colonne de table, mais dans une table fille !

    Je ne connais pas Derby ni ses capacités de prise en charge d'une expression régulière dans un filtre.
    Avec un SGBD dont le langage SQL est conforme à la norme ANSI, tu pourrais écrire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... WHERE destinataires LIKE ANY ('25', '25;%'; '%;25', '%;25;%')
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2002
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 152
    Points : 94
    Points
    94
    Par défaut
    Merci pour la réponse !

    Concernant la table fille, s'agit-il d'une table dont les colonnes sont les différentes lettres et les lignes les contacts associés ou l'inverse ?

    Çà me paraît quand même un peu lourd à gérer, non ?
    </aliasjcdenton>

    "Un Homme devient vieux lorsque ses regrets prennent la place de ses rêves"

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Ce que suggère al1_24 c'est, je crois, de créer une table destination DESTINATAIRE_LETTRE de structure
    LETTRE_ID
    DESTINATAIRE_ID
    avec LETTRE_ID DESTINATAIRE_ID comme clé primaire si comme probablement une lettre ne peut pas être envoyé plusieurs fois au même destinataire.

    Si tu trouves que ta structure est plus simple à gérer, c'est ton avis, mais tu te rends compte de son inconvénient quand tu cherches les lettres qui ont été envoyé au destinataire 25, et pire qui ont été envoyé à 25 et 28 mais pas à 23
    Bon courage pour les conditions sur les like et pour les performances aussi, parce que sur ce genre de structure les index ne sont pas très utiles.
    Après tout dépends de tes besoins et de la fréquence du genre de requête que tu demandes.
    A+
    Soazig

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2002
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 152
    Points : 94
    Points
    94
    Par défaut
    Oui, j'y vois plus clair maintenant et c'est une très bonne idée d'avoir une table intermédiaire, qui me permet de plus d'ajouter des infos telles que la date d'envoi à tel ou tel destinataire, la réception ou non d'un accusé de lecture, etc.

    Merci pour vos éclaircissements !

    </aliasjcdenton>

    "Un Homme devient vieux lorsque ses regrets prennent la place de ses rêves"

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

Discussions similaires

  1. Problème d'expression régulière dans une requète
    Par Jarode01 dans le forum Requêtes
    Réponses: 3
    Dernier message: 31/08/2009, 14h36
  2. Expressions régulières dans un SELECT
    Par CinePhil dans le forum Requêtes
    Réponses: 5
    Dernier message: 01/10/2008, 13h08
  3. Réponses: 6
    Dernier message: 14/12/2007, 23h26
  4. [RegEx] Utiliser une expression régulière dans une requête
    Par Tobleron dans le forum Langage
    Réponses: 2
    Dernier message: 18/02/2007, 19h00
  5. Réponses: 1
    Dernier message: 03/02/2006, 12h35

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