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

MS SQL Server Discussion :

comment ordonner un string délimité par un . et dont chaque partie est un int?


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de irnbru
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2004
    Messages : 316
    Billets dans le blog
    1
    Par défaut comment ordonner un string délimité par un . et dont chaque partie est un int?
    hello tout le monde!

    J'ai besoin de trier une colone qui un string avec le format suivant:

    xx.xx.xx.xx.xx.

    avec le point comme délimitateur et xx représentant des nombres.
    De plus le point à la fin est obligatoire.

    Comment procéder afin de trier cette colonne sur les xx et non comme un string classique? on se base sur les valeur int.

    sinon on aurait l'ordre suivant par défaut basé sur un string:

    1.0.0.0.
    10.0.0.0.
    2.0.0.0.

    au lieu de l'ordre attendu suivant

    1.0.0.0.
    2.0.0.0.
    10.0.0.0.

    pas évident!

    Merci pour toute aide
    IRNBRU

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    C'est une sacrée imbécilité que de stocker plusieurs données dans une même colonne de table. Cela viole la première forme normale. Dès lors vous ne faites plus des bases de données relationnelles, mais du fichier Cobol, avec tous les emmerdements possible, dont l'ordre de tri....

    Bien évidemment il existe des solutions pour contourner ce genre de chose, mais cela restera toujours catastrophique en terme de performances.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE MaTableALaCon
    (MaColonneALACon VARCHAR(32))
     
    INSERT INTO MaTableALaCon (MaColonneALACon)
    VALUES ('1.0.0.0'), ('10.0.0.0'), ('2.0.0.0')
    Solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM   MaTableALaCon
    ORDER  BY CAST(SUBSTRING(MaColonneALACon, 1, CHARINDEX('.', MaColonneALACon) -1) AS INT)
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre éclairé
    Avatar de irnbru
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2004
    Messages : 316
    Billets dans le blog
    1
    Par défaut
    Tout à fait d'accord avec toi lol

    Merci pour ta réponse mais je crois que j'ai oublié de préciser que le trie se fait sur toute la chaine et non seulement le premier int lol

    je voulais dire qu'on peut avoir

    1.0.3.6
    2.2.3.6

    donc c'est chaud
    l'idée que tu as avancée je l'ai fait pour le premier int mais le reste là je panique lol

    De plus les performances on s'en fout là car il s'agit de générer juste un fichier excel contenant les données triées à partir de cette colonne de merde!

    Merci si tu peux m'aider un peu encore
    IRNBRU

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Pour ce jeu d'essais nouveau la réponse est la même que celle déjà donné. EN effet 2 est supérieur à 1

    1) regarde les problèmes 28 et 29, dis moi si c'est proche. http://sqlpro.developpez.com/Exercic...e=part-3#LIV-H
    2) respecte la charte de postage en mettant le DDL de ta table, un jeu d'essais sous forme INSERT et un exemple de réponse : http://www.developpez.net/forums/d96...vement-poster/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre éclairé
    Avatar de irnbru
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2004
    Messages : 316
    Billets dans le blog
    1
    Par défaut
    Effectivement on peut comparer mes id avec la structure d'une IP c'est le même principe lol

    As tu la réponse à cet exercice IV-H. Problème n° 28 - Filtrer les adresses IP ?

    Merci!
    IRNBRU

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT TIP_ID,
           CAST(BIP_ADR1 AS TINYINT) AS BIP_ADR1,
           CAST(BIP_ADR2 AS TINYINT) AS BIP_ADR2,
           CAST(SUBSTRING(TIP_ADR, 1, CHARINDEX('.', TIP_ADR) - 1) AS TINYINT) AS BIP_ADR3,
           CAST(SUBSTRING(TIP_ADR, CHARINDEX('.', TIP_ADR) + 1, LEN(TIP_ADR) - CHARINDEX('.', TIP_ADR)) AS TINYINT) AS BIP_ADR4
    FROM   (SELECT TIP_ID, BIP_ADR1, SUBSTRING(TIP_ADR, 1, CHARINDEX('.', TIP_ADR) - 1) AS BIP_ADR2,
           SUBSTRING(TIP_ADR, CHARINDEX('.', TIP_ADR) + 1, LEN(TIP_ADR) - CHARINDEX('.', TIP_ADR)) AS TIP_ADR
            FROM (SELECT TIP_ID,
                         SUBSTRING(TIP_ADR, 1, CHARINDEX('.', TIP_ADR) - 1) AS BIP_ADR1,
                         SUBSTRING(TIP_ADR, CHARINDEX('.', TIP_ADR) + 1, LEN(TIP_ADR) - CHARINDEX('.', TIP_ADR)) AS TIP_ADR
                  FROM   TIP) T) TT
    Amuse toi bien !!!!

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. ListView alimenté par SQLITE3 et dont chaque ligne contient 3 boutons
    Par lauterry dans le forum Composants graphiques
    Réponses: 1
    Dernier message: 04/10/2010, 01h58
  2. Réponses: 3
    Dernier message: 07/05/2010, 14h24
  3. Réponses: 2
    Dernier message: 08/07/2009, 15h17
  4. Réponses: 2
    Dernier message: 22/05/2007, 10h25
  5. Réponses: 3
    Dernier message: 11/01/2006, 20h44

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