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 :

Récupérer partie d'un champ numérique


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 88
    Points : 54
    Points
    54
    Par défaut Récupérer partie d'un champ numérique
    Bonjour à tous,
    J'ai un champ numérique dans un base de données qui contient une année et un mois, du style 200604 ---> qui signifie donc 04/2006
    Je recherche donc une fonction qui me permettrait de récupérer soit l'année, soit le mois, via un genre de substring() mais pour les nombres.

    Est ce que quelqu'un sait si ca existe?

    Merci pour vos réponses.

    Nicolas.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,
    N'oublie pas de préciser ton sgbd.
    Ceci étant, substr s'applique également aux nombres.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 88
    Points : 54
    Points
    54
    Par défaut
    Merci pour ta réponse.

    En fait mes syntaxes peuvent être indépendantes de mon sgbd, donc ca peut être une fonction propre à mysql, mssql, oracle...

    Mais la fonction substr s'applique à quelle sgbd?
    et elle retourne quoi comme type de données?

  4. #4
    Membre éprouvé Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Points : 948
    Points
    948
    Par défaut
    ben exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT Substr(MaDate,1,4) 
    FROM Table
    De 1 à 4 car on récupère dans ce cas la l'année =)

    EDIT : Tu peux faire des test dessus aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT MaDate
    FROM Table
    WHERE Substr(MaDate,1,4)='2006'

  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 386
    Points
    18 386
    Par défaut
    Citation Envoyé par Snipah Voir le message
    Ceci étant, substr s'applique également aux nombres.
    Non, ça occasionne une conversion implicite ce qui est très mauvais.

    Vous pouvez :
    1) Convertir votre nombre en chaîne et utiliser substring ou left / right (SQL Server), ou substr (Oracle).
    2) Utiliser des fonctions numérique. L'année sera la partie entière de votre nombre divisé par 100.

    Le plus parlant (pour un autre développeur passant après vous) sera probablement la solution 1, le plus rapide en exécution la solution 2, enfin à moins d'une volumétrie en dizaines de millions (celà dépend de votre serveur bien entendu) vous ne constaterez probablement pas de différence de performance.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 88
    Points : 54
    Points
    54
    Par défaut
    Merci pour vos réponses rapides.

    Waldar, pour la deuxième solution, j'avais déjà testé, et mon soucis sera lorsque je voudrais récupéré le mois.

    Je vais essaiers un peu de regardé du coté de substr.
    Mais connais tu une syntaxe pour convertir mon numérique en char alors?

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Très mauvais, c'est un peu excessif. Pas optimal, d'accord.

    Comme ça ce serait donc plus performant?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select substr(to_char(200604),1,4) from dual

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 88
    Points : 54
    Points
    54
    Par défaut
    Oui, ok je veux bien, mais c'est pour quelle sgbd ca les gars?

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Citation Envoyé par Waldar Voir le message
    1) Convertir votre nombre en chaîne et utiliser substring ou left / right (SQL Server), ou substr (Oracle).
    Oracle.

  10. #10
    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 386
    Points
    18 386
    Par défaut
    MS SQL Server :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select
        T.mois                            as       mois_num ,
        cast(T.mois as varchar)           as       mois_char,
        left(cast(T.mois as varchar), 4)  as annee_mois_char,
        right(cast(T.mois as varchar), 2) as  mois_mois_char,
        (T.mois / 100)                    as annee_mois_num ,
        T.mois - (T.mois / 100)*100       as  mois_mois_num -- j'adore les maths sql server...
    from
    (
    select 200604 as mois union all
    select 200902 union all
    select 202012
    ) as T
    Oracle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select
        T.mois                            as       mois_num ,
        to_char(T.mois)                   as       mois_char,
        substr(to_char(T.mois), 1, 4)     as annee_mois_char,
        substr(to_char(T.mois), -2, 2)    as  mois_mois_char,
        trunc(T.mois / 100)               as annee_mois_num ,
        T.mois - trunc(T.mois / 100)*100  as  mois_mois_num
    from
    (
    select 200604 as mois from dual union all
    select 200902 from dual union all
    select 202012 from dual 
    ) T

  11. #11
    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 386
    Points
    18 386
    Par défaut
    Citation Envoyé par Snipah Voir le message
    Très mauvais, c'est un peu excessif.
    Désolé ça reste très mauvais.
    Sur une table avec index et/ou partitions, l'optimiser sera dans les choux si vous avez des conversions implicites.

    C'est certes une facilité pour les utilisateurs finaux qui n'ont qu'une connaissance limitée de la technique, mais pour un développeur c'est le mal absolu !

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    C'est noté, merci pour ces précisions!

    Je tiens à rassurer les personnes pour qui j'ai travaillé, j'ai jamais fait de substr sur un number

  13. #13
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Citation Envoyé par Waldar Voir le message
    T.mois - (T.mois / 100)*100 as mois_mois_num -- j'adore les maths sql server...
    Oui, c'est le traitement des types et des auto casts qui est un peu bizarre...
    Du coup, je me demande si ce n'est pas mieux de faire un cast inutile pour faire plus joli

    Cela dit, au passage, pour récupérer le mois, on peut faire un tout petit peu plus simple, puisque le reste de la division euclidienne est disponible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT T.mois % 100 --SQL Server
    SELECT mod(T.mois, 100) --Oracle, Sybase

  14. #14
    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 386
    Points
    18 386
    Par défaut
    Très bien vu pour le mod !

  15. #15
    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 386
    Points
    18 386
    Par défaut
    Citation Envoyé par pacmann Voir le message
    c'est le traitement des types et des auto casts qui est un peu bizarre...
    Je crois qu'il y a une option quelque part à changer mais comme ce n'est pas par défaut...

Discussions similaires

  1. [AC-2010] Formulaire - Comment récupérer une partie d'un champ texte
    Par Invité dans le forum IHM
    Réponses: 3
    Dernier message: 10/06/2011, 16h22
  2. [MySQL] Récupérer une partie d'un champ
    Par romeskira dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 22/09/2008, 21h43
  3. ADOTABLE + récupérer la somme d'un champ numérique
    Par digital prophecy dans le forum Bases de données
    Réponses: 5
    Dernier message: 19/07/2007, 23h01
  4. Récupérer la liste D champs d'une table
    Par DBBB dans le forum Bases de données
    Réponses: 6
    Dernier message: 09/06/2004, 09h14
  5. récupérer la partie décimale d’un champ
    Par maouazzani dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/04/2004, 16h10

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