2010-07-30 5 views
5

J'ai des données I nettoyage dans une ancienne table de données avant de le déplacer vers un nouveau. L'un des champs a des espaces dans la colonne, & gauche. J'ai écrit le code suivant pour répondre à cela et toujours avoir des espaces de premier plan? La majeure partie des données est propre lors de l'utilisation de ce code, mais pour une raison quelconque, il y a des espaces avant les adresses RT ...TSQL 2008 Utilisation de LTrim (RTrim et espaces encore dans les données

,CASE 
WHEN PropStreetAddr IS NOT NULL 
THEN (CONVERT(VARCHAR(28),PropStreetAddr)) 
WHEN PropStreetAddr is NOT NULL Then (Select LTrim(RTrim(PropStreetAddr)) As PropStreetAddr) 
    ELSE NULL END as 'PROPERTY_STREET_ADDRESS' 

données de sortie de l'échantillon:

1234 20th St 
    RT 1 BOX 2 
560 King St 
610 Nowland Rd 
    RT 1 
1085 YouAreHere Ln 
    RT 24 Box 12 
+2

Peut-être qu'ils ne sont pas des espaces ... – Fosco

+2

en double de [Supprimer fuite espace vide dans un contenu du champ] (http: // stackoverflow.com/questions/1864838/remove-trailing-empty-space-in-a-fie ld-content) - voir ma réponse pour savoir comment supprimer ASCII non-imprimable –

Répondre

6

Voici l'expression qui va fonctionner. Je suppose qu'il n'y a pas de contenu non visible. Vous devriez toujours suivre la recommandation de @OMG Ponies si vous le suspectez. Et je pense que l'expression PATINDEX peut être ajoutée à cette expression si vous devez gérer le contenu non visible. SQL Server CASE ne traite qu'une seule clause WHEN puis se brise. Vous n'obtenez donc jamais la deuxième conversion de données. En outre, toutes les valeurs NULL convertiront en NULL lorsque vous utilisez les fonctions LTRIM et RTRIM. Donc, vous n'avez pas besoin de le tester, sauf si vous voulez faire quelque chose avec les valeurs NULL.

Alors, essayez ceci:

CONVERT(VARCHAR(28), LTRIM(RTRIM(PropStreetAddr))) as [PROPERTY_STREET_ADDRESS] 
+0

Bobs and @OMG Ponies vous êtes le meilleur ça marche! Terrific, je pense que mon mal de tête va maintenant disparaître aussi! Merci à vous deux.Il ya des gens merveilleux sur ce site – JMS49

+0

Ceci est évidemment une vieille réponse maintenant, mais pour ceux qui viennent ici de SO ou Google je ne serais pas recommandez cette méthode surtout si vous avez affaire à l'internationalisation.Voyez la section @MarkMcGee [answer] (http://stackoverflow.com/a/12600716/692942) pour la façon correcte de disséquer ce problème: – Lankymart

6

utilisation:

WHEN PropStreetAddr is NOT NULL THEN 
    (SELECT LTRIM(RTRIM((REPLACE(PropStreetAddr, 
           SUBSTRING(PropStreetAddr, 
              PATINDEX('%[^a-zA-Z0-9 '''''']%', PropStreetAddr), 1), '') AS PropStreetAddr) 
+0

Toujours pas de changement, je suis perplexe. – JMS49

+0

@ JMS49: Avez-vous essayé seulement le REMPLACEMENT & c'est contenu? La seule chose à laquelle je peux penser est d'obtenir les données dans un éditeur où vous pouvez activer la visibilité du contenu non visible (P en arrière dans Textpad, par exemple). –

+0

Oui, j'ai utilisé le code tel que vous l'avez écrit. Mettez les données WORD et lui a demandé de montrer tous les caractères cachés .. données exemple: ..124 .. Woodley Park RD ... ..1085 TRAIL CT ..765 ... K ST .. 506..AVE B .1500..R..ST ..760 ... N RUE .1865..D ST .1810 ... A..STREET ..645 ... 15TH .. ST ..... RT..1.Cela m'amène à penser que le combo de trim ne fonctionne pas, mais pourquoi? – JMS49

10

J'ai eu le même problème - envelopper la chaîne dans un CAST (x comme varbinary (64)) montre l'hexagone et de ce que je vois A000 - que je croire est l'espace non-rupture.

Pour supprimer, essayez ceci (pour UNICODE);

LTRIM(RTRIM(REPLACE(my-column, NCHAR(0x00A0), ''))) 
+1

+1. ce problème et cela m'a aidé, je n'aurais jamais deviné que cet omble Unicode m'ennuyait –

+1

+1 'CAST (x AS VARBINARY (64))' est le meilleur conseil Comparaison rapide des différences dans l'hexagone adecimal fait toute la différence. – Lankymart

1

J'ai une situation similaire, d'abord je pensais que les fonctions LTRIM & RTRIM ne fonctionnaient pas correctement. Cependant, une fois je l'ai testé sur et je pouvais voir qu'il n'y avait pas un espace blanc approprié (le caractère réel peut être différent de votre infraction caractère non imprimable), en utilisant:

ASCII 

J'ai trouvé le caractère à être nommé 160 , alors je l'ai fait un remplacement comme:

SELECT REPLACE('NaughtyString', CHAR(160),'') 

aide quelqu'un espère que ce

Questions connexes