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 :

Trier des entiers de type VARCHAR


Sujet :

Langage SQL

  1. #1
    Débutant
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    1 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 125
    Points : 704
    Points
    704
    Par défaut Trier des entiers de type VARCHAR
    Bonjour,

    On m'a confier un projet avec un base de donnée existante.
    Je dois trier une colonne (de type VARCHAR) et qui contient des entiers + 1 caractère en fin.

    Comment trier par exemple :

    1A
    2
    3
    30E
    103
    123
    123A
    Merci

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Quel SGBD ?

    L'idée c'est de faire un substring du premier caractère à l'avant-dernier caractère, de convertir ceci en nombre et de trier dessus.

    Il faut aussi gérer le cas où ton caractère alpha est nul.

  3. #3
    Débutant
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    1 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 125
    Points : 704
    Points
    704
    Par défaut
    MySQL.

    Voila ce que j'ai pu sortir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT user_nom, CONVERT(user_parking,UNSIGNED INTEGER) AS nb, user_parking 
    FROM `utilisateurs`
    ORDER BY (nb)
    Mais je voudrais avoir ceux qui sont renseigné en premier et non pas les 0 en premier.

    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
    1
    2
    4
    6
    10
    50
    100
    0
    0
    0
    0
    0
    0
    Merci.

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    Ta séquence ne tient pas debout.
    Soit tu as 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 50, 100
    Soit tu as 100, 50, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
    Voire même 1, 10, 11, 2, 20, 3, 4, 50

    Mais jamais 1, 2, 3, 5, 10, 50, 0

    Si tu fais ORDER BY tu peux faire :
    croissant : par défaut ou ASC
    décroissant : DESC
    (cf l'aide sur ORDER BY)

    Le zéro sera à la fin si tu utilises DESC mais l'ordre sera 100, 50, 10, 5, 3, 2, 1, 0

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Si je pense qu'il y a un moyen :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    order by case when nb = 0 then null else nb end asc nulls last

  6. #6
    Débutant
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    1 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 125
    Points : 704
    Points
    704
    Par défaut
    Je connais la syntaxe d'ORDER BY mais je voulais savoir si y avait une fonction SQL qui pouvait m'aider.

    Ensuite j'ai essayé de ne pas afficher le 0 mais je comprend pas pourquoi, cette requete ne fonctionne pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT user_nom,user_email,user_tel_interne,user_tel_externe,user_fax ,user_tel_mobile, user_commentaire,
    CONVERT(user_parking,UNSIGNED INTEGER) AS user_parking_entier, user_parking
    FROM `utilisateurs`
    WHERE user_parking_entier <> 0
    ORDER BY (user_parking_entier)
    Citation Envoyé par Waldar Voir le message
    Si je pense qu'il y a un moyen :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    order by case when nb = 0 then null else nb end asc nulls last
    Apparemment non supporté par MySQL...

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Citation Envoyé par afrodje Voir le message
    Ensuite j'ai essayé de ne pas afficher le 0 mais je comprend pas pourquoi, cette requete ne fonctionne pas.
    On ne peut pas utiliser d'alias dans le where, il faut remettre la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT user_nom,user_email,user_tel_interne,user_tel_externe,user_fax ,user_tel_mobile, user_commentaire,
    CONVERT(user_parking,UNSIGNED INTEGER) AS user_parking_entier, user_parking
    FROM `utilisateurs`
    WHERE CONVERT(user_parking,UNSIGNED INTEGER) <> 0
    ORDER BY (user_parking_entier)
    Désolé pour le nulls last, ça a l'air proriétaire à Oracle en effet.

  8. #8
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    tu peux essayer ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT * FROM
    (SELECT user_nom, CONVERT(user_parking,UNSIGNED INTEGER) AS nb,  user_parking, 2 as class 
    FROM `utilisateurs`
    WHERE CONVERT(user_parking,UNSIGNED INTEGER) = 0
    UNION 
    SELECT user_nom, CONVERT(user_parking,UNSIGNED INTEGER) AS nb, user_parking, 1 as class
    FROM `utilisateurs`
    WHERE CONVERT(user_parking,UNSIGNED INTEGER) <>0 ) as temp
    order by temp.class,temp.nb

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Si je pense qu'il y a un moyen :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    order by case when nb = 0 then null else nb end asc nulls last
    En gardant la même logique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    order by case when user_parking_entier = 0 then 9999999 else user_parking_entier end asc
    Assurez-vous que 9999999 soit suffisant par rapport à vos données.

  10. #10
    Débutant
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    1 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 125
    Points : 704
    Points
    704
    Par défaut
    La solution de Cybher me convient tout à fait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT * FROM
    (SELECT user_nom, CONVERT(user_parking,UNSIGNED INTEGER) AS nb,  user_parking, 2 AS class 
    FROM `utilisateurs`
    WHERE CONVERT(user_parking,UNSIGNED INTEGER) = 0
    UNION 
    SELECT user_nom, CONVERT(user_parking,UNSIGNED INTEGER) AS nb, user_parking, 1 AS class
    FROM `utilisateurs`
    WHERE CONVERT(user_parking,UNSIGNED INTEGER) <>0 ) AS temp
    ORDER BY temp.class,temp.nb


    Merci à vous tous.

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

Discussions similaires

  1. Comment trier des fichiers par types et par tailles?
    Par xXO--Hades--OXx dans le forum Android
    Réponses: 3
    Dernier message: 07/12/2010, 12h09
  2. Trier des nombres entiers avec emu8086
    Par killerbee dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 20/03/2010, 00h29
  3. Réponses: 37
    Dernier message: 18/05/2008, 23h20
  4. récupérer le nom des champs d'une table de type VARCHAR
    Par melisse dans le forum Requêtes
    Réponses: 4
    Dernier message: 14/02/2008, 11h03
  5. Réponses: 5
    Dernier message: 15/11/2005, 12h57

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