Précédent   Forum du club des développeurs et IT Pro > Bases de données > Autres SGBD
Autres SGBD Vos questions sur les autres SGBD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 06/12/2012, 17h45   #1
Unreal Time
Futur Membre du Club
 
Inscription : 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
Unreal Time est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2012, 18h33   #2
al1_24
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 877
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 52
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 : 4 877
Points : 11 777
Points : 11 777
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
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 09h38   #3
Unreal Time
Futur Membre du Club
 
Inscription : mars 2009
Messages : 60
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 60
Points : 16
Points : 16
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?
Unreal Time est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 22h41   #4
fsmrel
Expert Confirmé Sénior

 
Avatar de fsmrel
 
Homme François de Sainte Marie
Spécialiste en bases de données
Inscription : septembre 2006
Messages : 3 640
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 : 3 640
Points : 9 194
Points : 9 194
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 »)

__________________

Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !)
fsmrel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 16h27   #5
Unreal Time
Futur Membre du Club
 
Inscription : mars 2009
Messages : 60
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 60
Points : 16
Points : 16
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!
Unreal Time est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 01h58   #6
fsmrel
Expert Confirmé Sénior

 
Avatar de fsmrel
 
Homme François de Sainte Marie
Spécialiste en bases de données
Inscription : septembre 2006
Messages : 3 640
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 : 3 640
Points : 9 194
Points : 9 194
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 »)

__________________

Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !)
fsmrel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 17h12   #7
Unreal Time
Futur Membre du Club
 
Inscription : mars 2009
Messages : 60
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 60
Points : 16
Points : 16
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 !
Unreal Time est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 05h04.


 
 
 
 
Partenaires

Hébergement Web