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

[9i] TRIM et la chaîne vide ''


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Inscrit en
    Avril 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 2
    Par défaut [9i] TRIM et la chaîne vide ''
    Bonjour à tous,

    En codant une proc PL/SQL, nous avons remarqué un petit quelque chose avec la fonction TRIM qui nous chagrine ! Nous ne comprenons surtout pas pourquoi elle se comporte comme ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select 1 from dual where trim('123') <> ''
    => renvoie NULL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select 1 from dual where trim('123') <> ' '
    => renvoie 1

    Comme trim('123') renvoie '123', je comprends que le 2éme point soit vérifié car c'est bien différent de ' '.
    Mais le 1er, je comprends pas car '123' est bien différent de '' !

    Quelqu'un peut il m'expliquer SVP ?

    Merci d'avance,
    Alex

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Quelle est votre version d'Oracle ?

    Pourquoi comparez-vous avec '' et non avec NULL ?
    J'utilise systématiquement le marqueur NULL et jamais '' car, comme vous le savez probablement, pour évaluer on utiliser IS [NOT] NULL alors que pour les autres expressions on utilise <>, <, >, =, etc.

    Avec null à la place de '', les résultats sont alors ceux attendus :
    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
    10g SOC5> select 1 from dual where trim('123') is not null;
     
             1
    ----------
             1
     
    1 ligne sélectionnée.
     
    10g SOC5> select 1 from dual where trim('123') <> ' ';
     
             1
    ----------
             1
     
    1 ligne sélectionnée.
     
    10g SOC5> select 1 from dual where '' <> NULL;
     
    aucune ligne sélectionnée
     
    10g SOC5> select 1 from dual where '' is null;
     
             1
    ----------
             1
     
    1 ligne sélectionnée.
     
    10g SOC5> select 1 from dual where trim('123') is not '';
    select 1 from dual where trim('123') is not ''
                                                *
    ERREUR à la ligne 1 :
    ORA-00908: mot-clé NULL absent
    A votre place, j'irai consulter la doc Oracle sur l'utilisation de '' à la place du marqueur NULL.

  3. #3
    Nouveau candidat au Club
    Inscrit en
    Avril 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 2
    Par défaut
    La version d'Oracle est la version 9i

    En fait dans la proc, le trim est effectué sur une variable de CHAR(3) qui peut valloir ' '.

    Ce qui donne :

    IF ls_ma_var IS NOT NULL AND TRIM(ls_ma_var) <> '' THEN
    code_condition_1 ;
    ELSE
    code_condition_2 ;
    END IF ;
    Dan le cas ou la variable vaut ' ', il faut que l'on rentre dans le code_condition_2. Ce qui ne serait pas le cas non plus si je mettais :

    IF ls_ma_var IS NOT NULL AND TRIM(ls_ma_var) IS NOT NULL THEN
    Cdlt,
    Alex

  4. #4
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Par défaut
    Bonjour,

    Si la variable à tester ne fait que 3 caractères pourquoi ne pas faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    IF ls_ma_var IS NOT NULL AND ls_ma_var <> '   ' THEN
    code_condition_1 ;
    ELSE
    code_condition_2 ;
    END IF ;
    Avec le format CHAR, des ' ' sont ajouté automatiquement pour faire la taille de la variable.

    A tester
    It isn't that they can't see the solution, it's that they can't see the problem.
    Mes Articles et Traductions (Microstrategy, Css et Javascript)
    Si vous souhaitez contribuer à la rubrique BI, contactez-moi ou tout autre membre de l'équipe BI par MP.

  5. #5
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Citation Envoyé par Metal_Garth
    Ce qui ne serait pas le cas non plus si je mettais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF ls_ma_var IS NOT NULL AND TRIM(ls_ma_var) IS NOT NULL THEN

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SQL>declare
      2    var char(3);
      3  begin
      4    var := ' ';
      5    if var is not null and trim (var) is not null then
      6         dbms_output.put_line ('NOT NULL');
      7    else
      8         dbms_output.put_line ('NULL');
      9    end if;
     10  end;
    NULL
     
    Procédure PL/SQL terminée avec succès.

Discussions similaires

  1. Modification de la propriété Chaîne vide autorisée
    Par hirochirak dans le forum Access
    Réponses: 3
    Dernier message: 11/01/2007, 10h28
  2. Alter chaîne vide autorisée
    Par Mvu dans le forum Access
    Réponses: 1
    Dernier message: 08/08/2006, 08h31
  3. Réponses: 3
    Dernier message: 20/07/2006, 20h46
  4. [DELPHI 2005] Paramètre ADO, SQL Server et chaîne vide (' ')
    Par danbern dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/08/2005, 15h21
  5. [debutant] Tester chaîne vide
    Par flogreg dans le forum Langage
    Réponses: 5
    Dernier message: 03/09/2004, 14h58

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