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

Bases de données Delphi Discussion :

SQL ORDER BY avec CAST


Sujet :

Bases de données Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 45
    Points : 27
    Points
    27
    Par défaut SQL ORDER BY avec CAST
    Bonjour à tous
    Mon transtypage échoue sur une colonne dont certaines chaines ne peuvent pas être tanstypées en nombre. Je pense qu'il s'agit d'un cas classique pour vous mais pas pour moi qui ne parle pas couramment le SQL
    Merci pour vos conseils.

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Et ma boule de cristal m'indique qu'il manque le type de la base de données ainsi que la requête qui va bien afin de pouvoir aider ceux qui pourraient répondre à la question.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 45
    Points : 27
    Points
    27
    Par défaut
    Excusez moi.
    La base Firebird embedded
    La requête qui va bien : ORDER BY CD.LONGUEUR DESC qui donne par exemple , sans surprise:
    aucune
    91,5
    91
    900
    CAST échoue sur aucune
    Dans CD.LONGUEUR je n'ai pas de NULL , seulement aucune et -

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Quel idée aussi de mettre un champ nommé Longueur avec un type varchar.

    Solution possible si tu as la main sur la structure de la base de données.
    1- Faire un update pour transformer aucune et - en -1 (a t on déja vu une longueur négative :p)
    2- changer le type de champ en numeric(10,5).
    3- quand tu vois -1 au niveau de l'affichage dans une grille ou autre tu marques aucune à la place
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 45
    Points : 27
    Points
    27
    Par défaut
    Bonjour à tous

    Merci Rayek.
    La base m'a été fournie sous forme de base Access seulement et je l'ai passée dans Firebird. En examinant un grand nombre de valeurs j'ai vu fréquemment Aucune et le tiret, ce qui expliquait le choix de Varchar. J'ai exclu un peu bêtement d'autres cas, rares mais bien présents, trouvés ensuite avec le CAST après codage des deux chaines connues, comme par exemple <18,9 ou >53,4, qui m'avaient échappé en lecture rapide. Cette situation m'apparaissant comme assez triviale, j'ai pensé qu'il existait une solution connue (un CAST amélioré, comme dans COVALESC? CASE avec SQLEXCEPTION? je ne vois pas ).
    A défaut je vais recenser les exceptions dans Delphi et remplacer par exemple <18,9 par -1018,9 et >53,4 par -2053,4 etc..selon les cas rencontrés. Ainsi mes cas serons distingués et je pourrai retrouver mes valeurs si besoin est .
    Pour la petite histoire, la valeur en question est une valeur moyenne, j'ai aussi le minimum et le maximum dans d'autres champs nommés malencontreusement MIN et MAX par le fournisseur, qui coincent avec le SQL

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Pour le min et max il te suffit d'utiliser le séparateur de champ de firebird (que je ne connais pas)
    Dans Access c'était les [ et ], MySQL `, mais firebird je ne sais pas.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  7. #7
    Membre du Club Avatar de delagoutte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 42
    Points : 65
    Points
    65
    Par défaut
    regarde la faq de firebird "How to convert string to number without getting any errors?" :
    http://www.firebirdfaq.org/faq139/

    tu mets ça dans une procédure stocké et ton problème devrait être réglé

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 45
    Points : 27
    Points
    27
    Par défaut
    Excellent Delagoutte, merci. Je subodorais le CAST amélioré et il existe. Il serait encore mieux s'il permettait la choix du retour car il renvoie zéro dans tous les cas, je verrai si je peux m'en contenter.
    J'étais branché SQL et je n'ai pas fait de recherche du coté Firebird.

  9. #9
    Membre du Club Avatar de delagoutte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 42
    Points : 65
    Points
    65
    Par défaut
    cela renvoi 0 car on lui dit de renvoyer 0 mais tu peut faire ce que tu veux.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DECLARE VARIABLE ch VARCHAR(10);
    DECLARE VARIABLE nr INTEGER:
    ...
    BEGIN
    nr = CAST(ch AS INTEGER);
    WHEN ANY DO nr = 0;
    END

    tu peut faire évoluer ta procédure pour avoir ce que tu veux
    par exemple :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    BEGIN
     if substring(ch from 1 to 1) ='<' then
        ch = replace(ch,'<','-10');
     if substring(ch from 1 to 1) ='>' then
        ch = replace(ch,'<','-20');
     if ch ='aucune' then
        ch = '-1';
    nr = CAST(ch AS INTEGER);
    WHEN ANY DO nr = 0;

  10. #10
    Membre du Club Avatar de delagoutte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 42
    Points : 65
    Points
    65
    Par défaut
    La réponse complète à ton problème devrait être :

    procedure stockée :
    Code SQL : 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
     
    CREATE PROCEDURE CUSTOMCAST (
        CH VARCHAR (255))
    RETURNS (
        NR FLOAT)
    AS
    BEGIN
      IF  (SUBSTRING(ch FROM 1 FOR 1) ='<') then
        ch = REPLACE(ch,'<','-10');
     
      IF (SUBSTRING(ch FROM 1 FOR 1) ='>') then
        ch = REPLACE(ch,'<','-20');
     
      if (ch ='aucune') then
        ch = '-1';
     
      ch = trim(ch);
     
      if (ch is null) then
        ch = '-1';
     
      BEGIN
        nr = CAST(ch AS float);
        WHEN ANY DO nr = 0;
      END
      SUSPEND;
    END

    ta réquête :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select CD.LONGEUR, (select * from customcast(CD.LONGEUR)) LONGEUR2 
    from CD order by LONGEUR2 asc

    il ne te reste plus qu'à adapter la procédure stockée selon tes besoins et les différents cas que tu rencontres

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 45
    Points : 27
    Points
    27
    Par défaut
    Quel style! Merci encore Delagoutte. C'est trop de sollicitude. Je suis persuadé que le SQL est ta langue maternelle. Je m'empresse d'ajouter que cela n'enlève rien à ton mérite. Pour moi il est beaucoup trop tard.

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

Discussions similaires

  1. [SQL] count & group avec order étrange ?
    Par rduvrac dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 28/04/2008, 02h30
  2. problème order by avec SQL 2000
    Par lazzeroni dans le forum Langage SQL
    Réponses: 0
    Dernier message: 09/04/2008, 08h07
  3. [SQL] Requête complexe avec appel multiple à la même table
    Par Julien Dufour dans le forum Langage SQL
    Réponses: 9
    Dernier message: 14/04/2005, 14h12
  4. Réponses: 3
    Dernier message: 11/01/2005, 08h20
  5. [SQL Server]Requête avec DateDiff
    Par sangokus dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 10/05/2004, 14h44

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