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

Autres SGBD Discussion :

Ne pas récupérer des champs avec espace


Sujet :

Autres SGBD

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 67
    Points : 48
    Points
    48
    Par défaut Ne pas récupérer des champs avec espace
    Bonjour,

    J'ai un problème lors d'une requête sql, dans la clause where j'ai mis la valeur "is not null" pour éviter de récupérer des champs null et aussi la requête va tester si la donnée n'est pas vide avec ' ' mais par contre, on a remarqué qu'il y avait des données avec des espaces (aléatoires) que je ne souhaite pas récupérer.

    Savez-vous comment faire ?


    Voici ma clause where pour le moment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AND champ1 <> '' 
    AND champ1 IS NOT NULL

    En vous remerciant

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 117
    Points : 28 494
    Points
    28 494
    Par défaut
    Comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AND TRIM(champ1) <> '' 
    AND champ1 IS NOT NULL

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 67
    Points : 48
    Points
    48
    Par défaut
    Merci pour votre réponse mais ça ne marche pas.
    Je me demande si ces caractères ne sont pas liés à des tabulations...

    Existe-t'il une fonction permettant de retirer ou de détecter la tabulation dans les données?

  4. #4
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 120
    Points : 31 629
    Points
    31 629
    Billets dans le blog
    16
    Par défaut
    Bonsoir Unreal Time,


    Supposons que la table T dont voici la structure soit à débarrasser de caractères du genre tabulation, retour chariot et autres joyeusetés polluant la colonne C :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE T
    (
            K          INT     NOT NULL   
          , C         VARCHAR(32)
        , CONSTRAINT T_PK PRIMARY KEY (K)
    ) ;

    La procédure ci-dessous n’est pas particulièrement sioux, elle est même très bœuf, mais du moins permet-elle de remplacer les scories (les valeurs hexadécimales comprises entres x'00' et x'0F' c'est-à-dire 0x00 et 0x0F) par quelque chose de lisible (en l’occurrence un point d’exclamation : '?'). J’ai utilisé le T-SQL de SQL Server 2005, la procédure est donc à adapter en fonction de votre SGBD.

    Un curseur permet de parcourir la table ligne par ligne. Pour chaque ligne, on examine chaque caractère de la colonne C, et si c'est une scorie, on remplace par un point d’interrogation.

    Nul doute que les cracks du SQL utilisé par votre SGBD (y-compris SQL Server !) sauront remplacer tout cela par une seule ligne dans l’instruction UPDATE...

    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
    28
    29
    30
    31
    32
    33
    34
    35
    DECLARE @K AS INT, @Chaîne AS Varchar(32), @ChaîneSortie AS Varchar(32) 
    DECLARE @I AS INT, @Imax AS INT ;
     
    DECLARE Curseur CURSOR FOR
        SELECT K, C 
        FROM   T ;
     
    OPEN Curseur ;
     
    FETCH Curseur INTO @K, @Chaîne
     
    WHILE @@FETCH_STATUS = 0
        BEGIN
            SET @ChaîneSortie = ''
            SET @I = 1 ; SET @Imax = LEN(@Chaîne)
     
            WHILE @I <= @Imax
                BEGIN
                    IF CAST(SUBSTRING(@Chaîne,@I,1) AS Binary(1)) < 0x16
                        BEGIN
                            SET @ChaîneSortie = @ChaîneSortie + '?' 
                        END
                    ELSE
                        BEGIN
                            SET @ChaîneSortie = @ChaîneSortie + SUBSTRING(@Chaîne,@I,1)
                        END
                    SET @I = @I + 1
                END
            UPDATE T
                SET C = @ChaîneSortie
                WHERE CURRENT OF Curseur
            FETCH Curseur INTO @K, @Chaîne
        END 
    CLOSE Curseur ;
    DEALLOCATE Curseur ;

    Pour voir le résultat :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT K, C, CAST(C as Varbinary(32)) AS C_hexa
    FROM T ;

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 67
    Points : 48
    Points
    48
    Par défaut
    Bonjour fsmrel,

    Je te remercie pour ta réponse remplie de bonnes idées.
    Je recherche du coup ma solution en cherchant à convertir en binaire la valeur retour chariot pour la retirer de la requête.

    J'ai appris entre temps qu'il s'agissait de Teradata SQL. Et j'ai oublié de préciser une contrainte qui m'est imposée, c'est que je ne dois pas modifier quoi que ce soit dans la table où je fais mes tests. Tout doit être dans une clause where.

    Je vous ai dis que c'était un défis? non bien pire!

  6. #6
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 120
    Points : 31 629
    Points
    31 629
    Billets dans le blog
    16
    Par défaut
    J'ai trouvé la fonction qui va bien dans le cas de SQL Server. Il s'agit de la fonction REPLACE associée à la fonction CHAR. Par exemple, dans la colonne C de la table T je recherche les retours-chariots (CHAR(13)) et affiche le contenu de la colonne avec un point d'interrogation à la place du retour-chariot :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT REPLACE (C, CHAR(13), '?') 
    FROM   T
    La fonction existe aussi avec DB2. Pour TERADATA je n'ai pas trouvé : peut-être CHAR2HEXINT ?

    A toutes fins utiles, selon la doc de Teradata, le retour-chariot se code en hexa : '0D'XC

    Voyez dans le forum Teradata, ça traite du problème, par exemple 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
    SELECT 
    MyVarCol
    , CHAR2HEXINT(MyVarCol) 
    , INDEX(MyVarCol, '00'XC ) AS BLANKLID
    , INDEX(MyVarCol, '20'XC ) AS SPACEID
    , INDEX(MyVarCol, '09'XC ) AS HTID
    , INDEX(MyVarCol, '0A'XC ) AS LFID
    , INDEX(MyVarCol, '0B'XC ) AS VTID
    , INDEX(MyVarCol, '0D'XC ) AS CRID
     
    FROM MyTable
    WHERE 
    ( 
    INDEX(MyVarCol, '00'XC ) > 0 -- blank
    OR INDEX(MyVarCol, '20'XC ) > 0 -- Spaces
    OR INDEX(MyVarCol, '09'XC ) > 0 -- Vertical tab
    OR INDEX(MyVarCol, '0A'XC ) > 0 -- Line Feed
    OR INDEX(MyVarCol, '0B'XC ) > 0 -- Vertical tab
    OR INDEX(MyVarCol, '0D'XC ) > 0 -- Carrriage Return
    )
    ;

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 67
    Points : 48
    Points
    48
    Par défaut
    Je vous remercie pour toutes votre aide et votre patience.
    Finalement, nous avons pu corriger le problème en utilisant un autre champ pour retirer les valeurs null du tableau.

    Merci beaucoup !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 21/12/2009, 12h08
  2. Réponses: 0
    Dernier message: 16/12/2008, 23h50
  3. [PHP-JS] bouton reset ne supprimant pas des champs avec value
    Par SegmentationFault dans le forum Langage
    Réponses: 4
    Dernier message: 29/11/2006, 15h52
  4. Réponses: 3
    Dernier message: 23/10/2005, 23h06
  5. [VB.NET] [ODBC] Récupérer des valeurs avec requête ODBC?
    Par Pleymo dans le forum Windows Forms
    Réponses: 5
    Dernier message: 04/03/2005, 17h38

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