2010-07-30 11 views
5

Tengo datos que limpiar en una tabla de datos anterior antes de moverla a uno nuevo. Uno de los campos tiene espacios en la columna, derecha & a la izquierda. Escribí el siguiente código para abordar esto y todavía tengo espacios iniciales: la mayor parte de los datos está limpia cuando se utiliza este código, pero por alguna razón hay espacios antes de las direcciones RT ... ¿Alguien más ha tenido este tipo de problema?TSQL 2008 Usar LTrim (RTrim y aún tener espacios en los datos

,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' 

de datos de salida de la muestra:

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

Tal vez ellos no son espacios ... – Fosco

+2

duplicados de [Quitar detrás de espacio vacío en el contenido de un campo] (http: // stackoverflow.com/questions/1864838/remove-trailing-empty-space-in-a-fie ld-content) - vea mi respuesta sobre cómo eliminar ASCII no imprimible –

Respuesta

6

Aquí está la expresión que funcionará. Supongo que no hay contenido no visible. Aún debes seguir la recomendación de @OMG Ponies si sospechas. Y creo que la expresión PATINDEX se puede agregar a esta expresión si debe tratar con el contenido no visible.

SQL Server CASE procesa solo una cláusula WHEN luego se rompe. Por lo tanto, nunca llegarás a la segunda conversión de datos. Además, todos los valores NULL se convertirán a NULL cuando utilice las funciones LTRIM y RTRIM. Por lo tanto, no es necesario que lo pruebes, a menos que quieras hacer algo con los NULL.

Así, intente esto:

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

Bobs y @OMG Ponies usted es el mejor ¡Funciona! ¡Estupendo, creo que mi dolor de cabeza también desaparecerá! Gracias a los dos. Hay algunas personas maravillosas en este sitio. – JMS49

+0

Esta es obviamente una respuesta bastante antigua, pero para aquellos que vienen de SO o Google, no lo haría. recomiende este método, especialmente si se trata de la internacionalización. Eche un vistazo a @MarkMcGee [respuesta] (http://stackoverflow.com/a/12600716/692942) para la forma correcta de analizar este problema. – Lankymart

6

uso:

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

Todavía no hay cambios, estoy perplejo. – JMS49

+0

@ JMS49: ¿Intentó simplemente REEMPLAZAR y su contenido? Solo otra cosa en la que puedo pensar es colocar los datos en un editor donde pueda activar la visibilidad del contenido no visible (por ejemplo, P en el panel de texto hacia atrás). –

+0

Sí, utilicé el código tal como lo escribiste. Poner los datos en WORD y le pidió que mostrar todos los personajes ocultos .. datos muestra: ..124 .. Woodley Park RD ..1085 ... TRAIL CT ..765 ... K ST .. 506..AVE B .1500..R..ST ..760 ... N STREET .1865..D ST .1810 ... A..STREET ..645 ... 15TH .. ST ..... RT..1. Esto me lleva a pensar que el combo de ajuste no funciona, pero ¿por qué? – JMS49

10

que he tenido el mismo problema - envolver la cadena en un CAST (x como varbinary (64)) muestra el hexágono y desde este Veo A000 - lo cual Creo que es un espacio sin interrupciones.

Para eliminarlo, intente esto (para UNICODE);

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

+1. Acabo de tener este problema y esto me ayudó. Nunca hubiera adivinado que este char Unicode me estaba molestando. –

+1

+1 'CAST (x AS VARBINARY (64))' es el mejor consejo. Comparación rápida de las diferencias en el hex. adecimal hace toda la diferencia. – Lankymart

1

que tienen una situación similar, en un principio pensé que los LTRIM & funciones RTRIM no funcionaban correctamente. Sin embargo, una vez que probé hacia fuera y pude ver que no era un carácter propio espacio en blanco (el personaje real puede ser diferente a su ofensor carácter no imprimible), usando:

ASCII 

me encontré con el carácter de ser nombrado 160 , por lo que entonces hice una sustitución como:

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

espero que ayude a alguien

Cuestiones relacionadas