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

SQL Oracle Discussion :

Comment éclater une plage de chiffres en SQL ?


Sujet :

SQL Oracle

  1. #1
    Membre du Club Avatar de mohe27
    Inscrit en
    Février 2007
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 112
    Points : 55
    Points
    55
    Par défaut Comment éclater une plage de chiffres en SQL ?
    Bonjour les amis,

    voilà je voudrai solliciter votre aide concernant un sujet qui porte à éclater une plage de chiffres utilisant SQL, exemple:
    plage 1: 20200006368301 --> 20200006368310
    plage 2: 20200006368501 --> 20200006368510
    en traitant ces plage ça devrai me donner ce qui suit:
    20200006368301
    20200006368302
    20200006368303
    20200006368304
    20200006368305
    20200006368306
    20200006368307
    20200006368308
    20200006368309
    20200006368310
    20200006368501
    20200006368502
    20200006368503
    20200006368504
    20200006368505
    20200006368506
    20200006368507
    20200006368508
    20200006368509
    20200006368510
    Imaginant qu'on ait des plages de plusieurs centaines de numéros à éclater cela serait très pénible de les traiter une par une en utilisant Excel par exemple.

    s'il y a une solution plus rapide en utilisant SQL cela serait génial.

    merci de votre aide les amis

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    En 10g : http://www.developpez.net/forums/d10...e/#post5787760
    En 9 cela ne marche pas.

    Sinon, en faisant un select sur une grosse table et en limitant par rownum (mais bon, c'est lié et limité au nombre de lignes de cette table)

    Dernière chose, le faire en plsql
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Si tu as de nombreuses plages déjà définit dans une table ça peut être pénible de passer toutes les plages une à une.
    Tu peux utiliser cette requête où t est la table qui définit les plages :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select t.debut + gen.column_value
      from t 
     cross join table (
                    cast(
                      multiset (
                         select rownum - 1
                           from dual
                        connect by level <= t.fin - t.debut + 1)
                        as sys.odcinumberlist)
                      ) gen
    Exemple :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    SQL> with t as (
      2  select 20200006368301 as debut, 20200006368310 as fin from dual union all
      3  select 20200006368501         , 20200006368510        from dual
      4  )
      5  select to_char(t.debut + gen.column_value)
      6    from t
      7   cross join table (
      8                  cast(
      9                    multiset (
     10                       select rownum - 1
     11                         from dual
     12                      connect by level <= t.fin - t.debut + 1)
     13                      as sys.odcinumberlist)
     14                    ) gen;
     
    TO_CHAR(T.DEBUT+GEN.COLUMN_VALUE)
    ----------------------------------------
    20200006368301
    20200006368302
    20200006368303
    20200006368304
    20200006368305
    20200006368306
    20200006368307
    20200006368308
    20200006368309
    20200006368310
    20200006368501
    20200006368502
    20200006368503
    20200006368504
    20200006368505
    20200006368506
    20200006368507
    20200006368508
    20200006368509
    20200006368510
     
    20 rows selected.

  4. #4
    Membre du Club Avatar de mohe27
    Inscrit en
    Février 2007
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 112
    Points : 55
    Points
    55
    Par défaut
    Merci Beaucoup skuatamad & McM,

    les deux solutions sont bonnes, je viens de les tester et ça marche

    bien à vous les amis

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Un script pour faire le travail inverse maintenant
    Bonjour à tous,

    Ce code m'a permis d'éclater mes données de deux tables différentes et d'en faire la comparaison.

    Merci au forum qui nous aide à gagner énormément de temps et à être plus professionnel.

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Par exemple :
    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
    29
    30
    31
    32
    33
    34
    35
    SQL> set num 20
    SQL> with t as (
      2  select 20200006368301 as c from dual union all
      3  select 20200006368302 as c from dual union all
      4  select 20200006368303 as c from dual union all
      5  select 20200006368304 as c from dual union all
      6  select 20200006368305 as c from dual union all
      7  select 20200006368306 as c from dual union all
      8  select 20200006368307 as c from dual union all
      9  select 20200006368308 as c from dual union all
     10  select 20200006368309 as c from dual union all
     11  select 20200006368310 as c from dual union all
     12  select 20200006368501 as c from dual union all
     13  select 20200006368502 as c from dual union all
     14  select 20200006368503 as c from dual union all
     15  select 20200006368504 as c from dual union all
     16  select 20200006368505 as c from dual union all
     17  select 20200006368506 as c from dual union all
     18  select 20200006368507 as c from dual union all
     19  select 20200006368508 as c from dual union all
     20  select 20200006368509 as c from dual union all
     21  select 20200006368510 as c from dual
     22  )
     23  select min(c) as deb_plage, max(c) as fin_plage
     24    from (select c - rownum as grp, c
     25            from t
     26         )
     27   group by grp;
     
               DEB_PLAGE            FIN_PLAGE
    -------------------- --------------------
          20200006368501       20200006368510
          20200006368301       20200006368310
     
    SQL>
    remplacez rownum par row_number si vous devez le faire en tenant compte d'autres informations

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/12/2006, 18h17
  2. Réponses: 2
    Dernier message: 27/09/2006, 19h41
  3. [C# 2.0] Comment créer une table sur un serveur SQL 2000 ?
    Par Filippo dans le forum Accès aux données
    Réponses: 1
    Dernier message: 15/09/2006, 13h30
  4. Comment sélectionner une plage de cellules non consécutives?
    Par jokair dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/08/2006, 15h36

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