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 :

Rechercher une valeur dans des plages sous forme texte


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 760
    Par défaut Rechercher une valeur dans des plages sous forme texte
    Bonjour à tous

    une question qui me prend la tête ...

    Soit , sur une ancienne base de données avec des objets , un des champs est le nombre de personnes autorisées

    Toute la base est notée avec pour le nombre de personnes avec des valeurs sous ce style :

    2 / 2-6 / 3-4 / 5 / 5-10 / 8 / etc

    pour 2 personnes , de 2 à 6 personnes ...

    Je recherche un critère de recherche pour trouver avec , une recherche de 5 personnes :

    -> 2-6
    ->5
    ->5-10

    L'inverse serait plus simple avec des BETWEEN, mais là je sèche...

    une idée ?

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 136
    Par défaut
    Si je comprends bien, la "capacité" est notée soit sous la forme d'un nombre unique, soit sous celle de deux nombres séparés par un tiret -.
    Ce que tu peux faire dans ta requête, c'est analyser cette chaine pour en extraire une valeur minimale et une valeur maximale. Si la chaine ne comporte pas de tiret, minimum et maximum prennent la valeur de la chaine, sinon le minimum est la valeur à gauche du tiret, le maximum celle de droite.
    Il ne te reste plus qu'à comparer la valeur cherchée avec cet intervalle.

    Je te laisse traduire cela dans le dialecte SQL utilisé par ton SGBD.
    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 émérite Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Par défaut
    Suivant la méthode décrite par al1_24, à partir d'SQL Server 2016 ça ressemblerai à ceci;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    ;with cte(id, nbPers) AS (
                  select 1, '3'
    	union select 2, '2-6'
    	union select 3, '5'
    	union select 4, '5-10'
    	union select 5, '4'
    )
    select id
    from (
    	select id, MIN(CAST(value AS tinyint)) AS minPers, MAX(CAST(value AS tinyint)) AS maxPers
    	from cte
    		cross apply string_split(nbPers, '-')
    	group by id
    ) AS td
    where 5 between minPers and maxPers;

  4. #4
    Membre chevronné Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 760
    Par défaut
    Hello,
    merci pour votre aide, au final je m'en suis sorti avec ce code :

    Sachant que xval va prendre la valeur cible a chercher

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
            IF
            (LOCATE('-', Nb_Personnes)> 0,
            (xval >= SUBSTR(Nb_Personnes,1,LOCATE('-', Nb_Personnes)-1)
            AND
            xval <= SUBSTR(Nb_Personnes,LOCATE('-', Nb_Personnes)+1 ) )
            , 
            xval = Nb_Personnes
            )
    En tout cas ça renvoie juste ce que je recherche


    Olivier

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

Discussions similaires

  1. rechercher une valeur dans une plage
    Par aaristocat dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 27/06/2018, 11h15
  2. [XL-2010] recherche une valeur dans des cellules fusionnées
    Par gigalia dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 13/07/2016, 17h32
  3. [XL-2010] recherche une celule dans des plages ne fonctionne pas
    Par mouftie dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 13/02/2016, 15h32
  4. [AC-2007] Rechercher une valeur dans un sous-formulaire
    Par Crachover dans le forum IHM
    Réponses: 2
    Dernier message: 28/01/2010, 14h26

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