Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1
    Futur Membre du Club
    Inscrit en
    mars 2009
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : mars 2009
    Messages : 60
    Points : 16
    Points
    16

    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 :
    1
    2
    AND champ1 <> '' 
    AND champ1 IS NOT NULL

    En vous remerciant

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro Alain
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    5 480
    Détails du profil
    Informations personnelles :
    Nom : Homme Alain
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 5 480
    Points : 13 686
    Points
    13 686

    Par défaut

    Comme ça ?
    Code :
    1
    2
    AND TRIM(champ1) <> '' 
    AND champ1 IS NOT NULL
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Futur Membre du Club
    Inscrit en
    mars 2009
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : mars 2009
    Messages : 60
    Points : 16
    Points
    16

    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 Confirmé Sénior
    Avatar de fsmrel
    Homme Profil pro François de Sainte Marie
    Spécialiste en bases de données
    Inscrit en
    septembre 2006
    Messages
    4 397
    Détails du profil
    Informations personnelles :
    Nom : Homme François de Sainte Marie
    Localisation : Autre

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

    Informations forums :
    Inscription : septembre 2006
    Messages : 4 397
    Points : 11 849
    Points
    11 849

    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 :
    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 :
    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 :
    1
    2
    SELECT K, C, CAST(C AS Varbinary(32)) AS C_hexa
    FROM T ;
    Faites simple, mais pas plus simple ! (A. Einstein)
    E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)


    De grâce, pas de questions techniques par MP, ma boîte de réception explose !
    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !)

  5. #5
    Futur Membre du Club
    Inscrit en
    mars 2009
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : mars 2009
    Messages : 60
    Points : 16
    Points
    16

    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 Confirmé Sénior
    Avatar de fsmrel
    Homme Profil pro François de Sainte Marie
    Spécialiste en bases de données
    Inscrit en
    septembre 2006
    Messages
    4 397
    Détails du profil
    Informations personnelles :
    Nom : Homme François de Sainte Marie
    Localisation : Autre

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

    Informations forums :
    Inscription : septembre 2006
    Messages : 4 397
    Points : 11 849
    Points
    11 849

    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 :
    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 :
    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
    )
    ;
    Faites simple, mais pas plus simple ! (A. Einstein)
    E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)


    De grâce, pas de questions techniques par MP, ma boîte de réception explose !
    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !)

  7. #7
    Futur Membre du Club
    Inscrit en
    mars 2009
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : mars 2009
    Messages : 60
    Points : 16
    Points
    16

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •