Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/04/2011, 13h07   #1
Membre du Club
 
Inscription : décembre 2002
Messages : 140
Détails du profil
Informations forums :
Inscription : décembre 2002
Messages : 140
Points : 41
Points : 41
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 :
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"
aliasjcdenton est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 13h20   #2
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 445
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 445
Points : 7 532
Points : 7 532
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 :
... 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
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 14h18   #3
Membre du Club
 
Inscription : décembre 2002
Messages : 140
Détails du profil
Informations forums :
Inscription : décembre 2002
Messages : 140
Points : 41
Points : 41
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"
aliasjcdenton est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 22h37   #4
Membre expérimenté
 
Inscription : octobre 2002
Messages : 654
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 654
Points : 552
Points : 552
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
soazig est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2011, 10h13   #5
Membre du Club
 
Inscription : décembre 2002
Messages : 140
Détails du profil
Informations forums :
Inscription : décembre 2002
Messages : 140
Points : 41
Points : 41
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"
aliasjcdenton est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h12.


 
 
 
 
Partenaires

Hébergement Web