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 :

Compter le nombre de valeurs d'une liste


Sujet :

Langage SQL

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut Compter le nombre de valeurs d'une liste
    Bonjour,

    Je suis entrain de faire une procédure ou je passe:
    - un nom de ville
    - un nombre d'habitant
    - la liste des habitants
    Exemple
    P_HABITANT('Paris', 2, 'Habitant 1 ; Habitant 2 ;')
    Je souhaiterait enlever les ; dans la liste des habitant et aussi compter le nombre qu'il y a dans cette liste pour vérifier qu'il correspond bien au nombre passé en paramètre qui est le nombre d'habitant.
    Cette procédure va me permettre de deux Inserts:
    - 1 dans la table ville avec nom de la ville et nombre d'habitant
    - L'autre dans la table habitant_ville avec pour chaque habitant 1 enregistrement avec nom, prénom et id ville

    Merci de votre aide

  2. #2
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    En fait, ce que tu dois faire, c'est compter les point virgule !
    De ce fait, ca depend un peu de ta base, mais tu as au moins deux solutions.

    Soit tu arrives à remplacer tes points virgules par du vide, un truc du genre replace(machaine, ';', '') et donc tu peux faire la difference du nombre de caractère entre l'original et le modifié.

    Soit tu as carrement une fonction qui te compte le nombre de ; ... ca existe notament sous oracle.

    Mais commence par nous dire avec quoi est ce que tu travailles

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Je suis sous oracle
    J'ai une table ville avec :
    - idville
    - nomVille
    - nbHabitant

    Et j'ai une table réservation avec :
    - id Habitant
    - nom
    - prénom
    - idVille

    Par si je passe deux habitant pour Paris, sa va m’insérer deux ligne dans habitants. Mais je vois pas comment faire dans la procédure pour séparer également le nom et le prénom

  4. #4
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    Ok donc en oracle, tu as ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    with matable as (
    select 'bouh; toto; tata' a from dual 
    )
    select (length(a) - length(REPLACE(a,';','')) + 1) as nb_champs from matable
     
     
     
    with matable as (
    select 'bouh; toto; tata' a from dual 
    )
    select REGEXP_COUNT(a, ';')+1 from matable

    Choisis celui qui te plait le plus. ^^
    Ca, c'est pour compter ton nombre de champs...

    et maintenant, pour les selectionner, ca va donner un truc comme ca.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    with matable as (
    select 'bouh;toto bouh;tata' a from dual 
    )
    select 
    REGEXP_SUBSTR(a, '[^;]+', 1, 2)
    from matable
    tu joue avec le paramètre où y'a le 2... genre, 1, 2, 3 ca va te sortir tes noms.



    si tu as encore besoin de séparer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    with matable as (
    select 'paul bouh;toto bouh;barbie tata' a from dual 
    )
     
    select regexp_substr(fullname,'[^\ ]+', 1, 1) as fisrtname,
    regexp_substr(fullname,'[^\ ]+', 1, 2) as lastname 
    from (
    <div style="margin-left:40px">select 
    REGEXP_SUBSTR(a, '[^;]+', 1, 3) as fullname
    from matable</div>)
    Sachant qu'oracle est pas vraiment fait pour ca... donc d'une je garantie pas les perf, et de deux, que se passera t il quand tu auras deux prénoms, ou un nom de famille avec particule...

  5. #5
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Il sert à quoi le 'a' que tu as mi dans les premières requêtes

  6. #6
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    c'est le nom de ma colonne... dans laquelle tu es censé avoir tes "noms" concatenés avec des points virgule...

  7. #7
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Mais là mes nom sont dans un paramètre de ma procédure et ensuite je les insèrent dans la table donc comment on fait pour savoir qu'on les récupère dans le paramètre de la procédure

  8. #8
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    c'est pareil :p
    Un paramètre, c'est une colonne qui n'a qu'une ligne

    tu l'utilises avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select pametre into ... from dual
    par exemple

  9. #9
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Je revient sur ce sujet car je ne vois pas du tout comment faire ma requête pour compter le nombre de ";" dans mon paramètre qui contient la liste de personne

  10. #10
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Finalement j'ai réussi à faire ceci mais je vois pas comment faire pour insérer mes habitants. J'ai pensé à une boucle for mais je vois pas comment récupérer le nom et le prénom séparément
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    CREATE OR REPLACE PROCEDURE "P_INSERT_HABITANT" (uneVille IN VARCHAR2, nombreHabitant IN NUMBER, listeHabitant IN VARCHAR2)
    IS
      nbHabitantListe NUMBER(2);
      numVille NUMBER(3);
    BEGIN
      --Vérification que le nombre de d'habitant dans liste correspond bien au nombre déclaré
      WITH maTable AS(
        SELECT listeHabitant FROM DUAL 
      )
      SELECT REGEXP_COUNT(listeHabitant , ';')+1 INTO nbHabitantListe FROM maTable;
     
      IF(nbHabitantListe != nombreHabitant )THEN
          DBMS_OUTPUT.PUT_LINE('Le nombre d''habitant dans la liste est différent de celui déclaré dans nombreHabitant! ');
      ELSE
          --Insertion de la ville
                INSERT INTO VILLE(ville, nbHabitant) 
                VALUES(uneVille, nombreHabitant);
     
                SELECT idVille INTO numVille FROM VILLE
                WHERE ROWID=(SELECT MAX(ROWID) FROM VILLE);
     
                --Insertion des habitants
                --BOUCLE FOR
      END IF;
     
    END P_INSERT_HABITANT;
     
    /

  11. #11
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    tu fais effectivement une boucle for, et je t'ai donné la requete pour séparer prenom et nom.

    tu as par exemple


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for i from 1 to nbHabitantListe
    loop
    select REGEXP_SUBSTR(listeHabitant, '[^;]+', 1, i) into habitant_i
    from matable;
     
    select regexp_substr(habitant_i,'[^\ ]+', 1, 1) into prenom_i, 
    regexp_substr(habitant_i,'[^\ ]+', 1, 2)  into nom_i
    from dual;
     
    insert into matable values (prenom_i, nom_i);
     
    end loop
    ca doit donner un truc comme ca. c'est pas parfait, mais c'est pour te donner une idée.
    Tu peux bien sur faire les regexp directement sur la premiere requete plutot que de passer par une deuxieme requete sur dual. mais c'est pour bien te montrer les étapes.

  12. #12
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    J'ai fait ceci mais sa ne fonctionne pas. On me dit que nbHabitantListe n'est pas un curseur. En effet, c'est une variable déclaré. En revanche, listeHabitant est un paramètre de type varchar passé à la procédure qui contient les nom et prénom des habitants
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for i from 1 to nbHabitantListe
    loop
    select REGEXP_SUBSTR(listeHabitant, '[^;]+', 1, i) into habitant_i
    from matable;
     
    select regexp_substr(habitant_i,'[^\ ]+', 1, 1) into prenom_i, 
    regexp_substr(habitant_i,'[^\ ]+', 1, 2)  into nom_i
    from dual;
     
    insert into matable values (prenom_i, nom_i);
     
    end loop

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 4
    Points : 9
    Points
    9
    Par défaut
    Bonjour,
    Mettre un champ nbhabitant n'est vraiment pas pertinent (dans le cadre d'une modélisation normalisée en tout cas...).
    Retrouver le nom et prénom me parait un peu hasardeux aussi... Comment faire quand il y aura des prénoms et/ou noms composés? "Jean-Daniel Henri De La Pierre-qui-Roule" comment tu peux retrouver le nom et le prénom?? Si tu ne prévois pas un séparateur entre le nom et le prénom....

Discussions similaires

  1. Réponses: 5
    Dernier message: 26/11/2012, 13h51
  2. Compter le nombre d'éléments dans une liste
    Par marcus73 dans le forum SAS Base
    Réponses: 3
    Dernier message: 30/12/2011, 14h56
  3. Réponses: 6
    Dernier message: 04/11/2008, 23h35
  4. Réponses: 2
    Dernier message: 07/05/2007, 00h43
  5. Compter le nombre d'apparitions d'une valeur
    Par dynexd dans le forum Access
    Réponses: 4
    Dernier message: 07/04/2006, 02h30

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