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 :

Tri alphanumérique sql


Sujet :

SQL Oracle

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Tri alphanumérique sql
    Bonjour,

    J'ai une table avec un champ en alphanumérique de cette forme:
    Champ ADRESSE:
    03D3/03/101
    03D3/03/11
    03D4/03/101
    03D4/03/10
    03D4/03/11

    Mon but est de trier sur ce champ de façon à obtenir:
    03D3/03/11
    03D3/03/101
    03D4/03/10
    03D4/03/11
    03D4/03/101

    Le tri est donc sur les premiers caractères avant le premier '/', sur celui entre les '/', et sur les derniers après le dernier '/'

    Quelqu'un m'a trouver une solution avec une fonction 'instrrev', mais celle ci ne fonctionne pas sous mon access(qui est pourtant en 2000)
    Je préfère donc éviter des problèmes de version d'access chez mon client.

    Une idée?

  2. #2
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 76
    Points : 81
    Points
    81
    Par défaut
    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
    with
    adresse as (
    select '03D3/03/11' as champ from dual UNION ALL
    select '03D3/03/101'  from dual UNION ALL
    select '03D4/03/10' as champ from dual UNION ALL
    select '03D4/03/11' from dual UNION ALL
    select '03D4/03/101' from dual
    ),
    req as (
    select
    SUBSTR(champ,0,INSTR(champ,  '/', 1, 2)) as part1,
    SUBSTR(champ,INSTR(champ,  '/', 1, 2)+1 ,length(champ)) as part2
    from adresse
    )
    select part1||part2 as champ
    from req
    order by part1,reverse(rpad(part2,10,0))
    Faut trouver le moyen de remplacer le 10 ds rpad par max(length(part2))

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 76
    Points : 81
    Points
    81
    Par défaut
    Version avec le rpad alloué dynamiquement.

    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
    with
    adresse as (
    select '03D3/03/11' as champ from dual UNION ALL
    select '03D3/03/101'  from dual UNION ALL
    select '03D4/03/10' as champ from dual UNION ALL
    select '03D4/03/11' from dual UNION ALL
    select '03D4/03/101' from dual
    ),
    req as (
    select
    SUBSTR(champ,0,INSTR(champ,  '/', 1, 2)) as part1,
    SUBSTR(champ,INSTR(champ,  '/', 1, 2)+1 ,length(champ)) as part2
     
    from adresse
    )
    select part1||part2 as champ
    from req , (select max(length(part2)) lg from req) reqLong
    order by part1,reverse(rpad(part2,reqLong.lg,0))

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    Si la 3ème chaîne est un nombre qui ne commence pas par 0, traitez-là comme un nombre, l'ordonnancement sera plus simple:

    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
    WITH
    adresse AS (
    SELECT '03D3/03/11' AS champ FROM dual UNION ALL
    SELECT '03D3/03/101'  FROM dual UNION ALL
    SELECT '03D4/03/10' AS champ FROM dual UNION ALL
    SELECT '03D4/03/11' FROM dual UNION ALL
    SELECT '03D4/03/101' FROM dual
    ),
    req AS (
    SELECT
    SUBSTR (champ, 0, INSTR (champ,  '/', 1, 2)) AS part1,
    TO_NUMBER (SUBSTR (champ, INSTR (champ,  '/', 1, 2)+1 ,LENGTH  (champ))) AS part2
    FROM adresse
    )
    SELECT part1||part2 AS champ
    FROM req
    ORDER BY part1, part2

Discussions similaires

  1. [WD12] Fonction tri automatique + SQL Server
    Par Raphael1980 dans le forum WinDev
    Réponses: 3
    Dernier message: 05/12/2008, 17h39
  2. Tri Oracle Sql
    Par Invit-é dans le forum SQL
    Réponses: 2
    Dernier message: 23/09/2008, 14h10
  3. [Système] Tri alphanumérique en UTF-8
    Par nazoreen dans le forum Langage
    Réponses: 5
    Dernier message: 24/06/2007, 14h15
  4. Réponses: 1
    Dernier message: 22/06/2007, 12h48
  5. Réponses: 5
    Dernier message: 23/01/2006, 19h13

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