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 Firebird Discussion :

[CASE + VARCHAR] : Nombre de caractères


Sujet :

SQL Firebird

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut [CASE + VARCHAR] : Nombre de caractères
    Bonjour,

    J'ai remarqué une chose sur l'utilisation du CASE sous Firebird 2.5 sur une petite table de test et me demandais si c'était un bug ou un fonctionnement normal (et dans ce cas, pourquoi...).
    IDE :
    Delphi XE2, composants DbExpress
    Table1 :
    Champ1 : Varchar(15)
    Champ2 : Integer

    Je passe la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Update Table1 
    Set Champ1 =
       Case
           When Champ2 < 3 then 'EN COURS'
           Else 'ECHEC'
       End
    Where Champ2 is not null;
    Les champs qui devraient être valorisés à 'ECHEC' prennent la valeur 'ECHEC ', visiblement parce que 'EN COURS' fait 8 caractères. Le problème ne se pose pas si j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Else Cast('ECHEC' as Varchar(5))
    Avez-vous une explication ?

    Merci d'avance pour vos réponses.

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 944
    Points : 123
    Points
    123
    Par défaut
    essaye de cette maniére
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    UPDATE Table1 
    SET Champ1 =
       Case
           When (Champ2 < 3) then 'EN COURS'
           Else 'ECHEC'
       End
    WHERE Champ2 IS NOT NULL;

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    non, pas mieux...

  4. #4
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    Cela fonctionne très bien ici :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    SQL> create table table1 (champ1 varchar(15), champ2 integer);
    SQL> show table table1;
    CHAMP1                          VARCHAR(15) Nullable 
    CHAMP2                          INTEGER Nullable 
    SQL> insert into table1 (champ2) values (1);
    SQL> insert into table1 (champ2) values (2);
    SQL> insert into table1 (champ2) values (3);
    SQL> insert into table1 (champ2) values (4);
    SQL> commit;
    SQL> select champ1,champ2 from table1;
     
    CHAMP1                CHAMP2 
    =============== ============ 
    <null>                     1 
    <null>                     2 
    <null>                     3 
    <null>                     4 
     
    SQL> update table1 set champ1= iif(champ2<3,'EN COURS','ECHEC') where champ2 is not null;
    SQL> commit;
    SQL> select champ1,champ2 from table1;
     
    CHAMP1                CHAMP2 
    =============== ============ 
    EN COURS                   1 
    EN COURS                   2 
    ECHEC                      3 
    ECHEC                      4 
     
    SQL> update table1 set champ1= NULL;
    SQL> commit;
    SQL> select champ1,champ2 from table1;
     
    CHAMP1                CHAMP2 
    =============== ============ 
    <null>                     1 
    <null>                     2 
    <null>                     3 
    <null>                     4 
     
    SQL> update table1 set champ1= case when champ2<3 then 'EN COURS' else 'ECHEC' end where champ2 is not null;
    SQL> commit;
    SQL> select champ1,champ2 from table1;
     
    CHAMP1                CHAMP2 
    =============== ============ 
    EN COURS                   1 
    EN COURS                   2 
    ECHEC                      3 
    ECHEC                      4 
     
    SQL> show version;
    ISQL Version: UI-V2.5.2.26539 Firebird 2.5
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  5. #5
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci makowski,
    Effectivement, ça fonctionne, ce n'est pas vraiment le problème. Ce qui m'embête c'est que les lignes valorisées à 'ECHEC' sont en fait "updatée" à 'ECHEC '... (ECHEC + 3 espaces).
    Si après ton update, tu fais un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select CHAMP1 || 'FIN' from Table1;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Tu vas récupérer :
    CHAMP1                
    ===============
    ECHEC   FIN
    C'es là que c'est un peu génant...

  6. #6
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    certes, mais ça c'est normal, puisque 'EN COURS' c'est un CHAR(8)

    donc si tu veux autre chose, oui il faut un cast
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 245
    Points : 534
    Points
    534
    Par défaut
    Bonne année à vous.

    Avec SET champ1= Trim(trailing from case when champ2<3 then 'EN COURS' else 'ECHEC' end) ça ne supprime pas les espaces en trop?

    André

  8. #8
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    oui un trim suffit aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SQL> select iif(1=1,'EN COURS','ECHEC')||'BLA', iif(1=0,'EN COURS','ECHEC')||'BLA', trim(iif(1=1,'EN COURS','ECHEC'))||'BLA', trim(iif(1=0,'EN COURS','ECHEC'))||'BLA' from rdb$database;
     
    CONCATENATION CONCATENATION CONCATENATION CONCATENATION 
    ============= ============= ============= ============= 
    EN COURSBLA   ECHEC   BLA   EN COURSBLA   ECHECBLA
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/05/2008, 11h46
  2. [JTextArea] limiter le nombre de caractères
    Par spoutyoyo dans le forum Composants
    Réponses: 5
    Dernier message: 14/09/2007, 16h45
  3. Réponses: 2
    Dernier message: 21/09/2004, 20h01
  4. [JTextField] Limiter le nombre de caractères
    Par thomas_strass dans le forum Composants
    Réponses: 2
    Dernier message: 08/09/2004, 15h06
  5. nombre de caractère retourné...
    Par sonialem2000 dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/08/2004, 05h06

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