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 :

Inclure les bornes de fin sur les opérateurs pour des champs Varchar


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 44
    Points : 28
    Points
    28
    Par défaut Inclure les bornes de fin sur les opérateurs pour des champs Varchar
    Salut !

    Voilà j'ai deux différentes requêtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM personne WHERE nom BETWEEN 'A' AND 'C';
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM personne WHERE nom <= 'C'
    J'aimerai que dans mes résultats les personnes ayant des noms commencant par C soient également affichées. L'équivalent d'un LIKE 'C%' par exemple.

    Est-ce possible ?

  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
    21 865
    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 : 21 865
    Points : 53 021
    Points
    53 021
    Billets dans le blog
    6
    Par défaut
    Votre demande est confuse.. dans quelle requête ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM personne WHERE nom BETWEEN 'A' AND 'Czzzz';
     
    SELECT * FROM personne WHERE nom <= 'Czzz'
    A +

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 44
    Points : 28
    Points
    28
    Par défaut
    Merci pour la réponse.

    Le contexte en fait est une IHM (formulaire ayant 2 champs, un pour la borne de début et un pour la borne de fin) où l'utilisateur peut rechercher les personnes selon leurs noms en indiquant 2 bornes :
    - la borne de début, qui elle ne pose pas de problème
    - la borne de fin, qui elle pose problème

    Prenons deux exemples concrets :
    Admettons que l'utilisateur veut récupérer toutes les personnes ayant un nom commencant par la lettre 'C', il va donc tapper dans le formulaire dans le champ pour la borne de fin la lettre 'C' et laisser l'autre champ vide, la requête qui sera utilisée sera la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM personne WHERE nom <= 'C'
    Admettons maintenant que l'utilisateur veuille récupérer toutes les personnes ayant des noms compris entre 'A' et 'C', il remplit sont formulaire avec 'A' et 'D', et la requête générée est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM personne WHERE nom BETWEEN 'A' AND 'C';
    Maintenant le problème est que ces 2 requêtes ne me renvoient jamais les personnes dont le nom commence par 'C'. Ce qui est tout à fait normal car 'C' est bien inférieur à 'CA' ou 'CDAZEA' etc...
    J'aimerai donc trouver une syntaxe SQL me permettant d'inclure ces résultats un peu de la même manière que le LIKE 'C%'.
    Sachant que je n'ai pas de contrôle direct sur les paramètres puisqu'ils sont définis par l'utilisateur.

    J'aimerai autant que possible éviter de devoir moi même surcharger ces paramètres pour ajouter 'zzzz' à la fin et "contourner" le problème.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 44
    Points : 28
    Points
    28
    Par défaut
    J'ai trouvé une solution pour le BETWEEN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nom FROM personne WHERE nom RLIKE '^[a-c]' ORDER BY nom;
    RLIKE synonyme de REGEXP.
    Mais je n'ai toujours pas trouvé de solution pour l'opérateur '< '

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 865
    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 : 21 865
    Points : 53 021
    Points
    53 021
    Billets dans le blog
    6
    Par défaut
    utilisez la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ... --> jamais *, mettez la liste des colonnes
    FROM   personne 
    WHERE  nom BETWEEN @BORNE1 
      AND  COALESCE(@BORNE2, @BORNE1) + 'ZZZ';
    @BORNE1 et @BORNE2 étant des paramètres de votre requête.

    Ainsi s'il ne passe que la borne 1 cela fera de ? à ?ZZZ
    S'il passe les deux bornes, cela fera de ?1 à ?2ZZZZ

    A +

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    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 102
    Points : 28 401
    Points
    28 401
    Par défaut
    Une autre solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * 
    FROM personne 
    WHERE SUBSTRING(nom FROM 1 FOR 1) BETWEEN 'A' AND 'C';
    Mais cela vous fait perdre la possibilité d'utiliser un index sur la colonne Nom pour optimiser la recherche.

    La solution proposée par SQLPro est optimale

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 44
    Points : 28
    Points
    28
    Par défaut
    Merci pour vos réponses !

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 31/03/2006, 20h02
  2. CSS : Bordure sur les liens mais pas sur les images ?
    Par monstroplante dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 04/02/2006, 14h18
  3. [CSS] border-collapse sur les TR mais pas sur les TD.
    Par hpfx dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 03/04/2005, 16h16

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