2010-09-13 99 views
29

Tengo una tabla y las columnas en esta tabla contienen espacios vacíos para algunos registros. Ahora necesito mover los datos a otra tabla y reemplazar los espacios vacíos con un valor de NULL.¿Cómo convertir espacios vacíos en valores nulos usando SQL Server?

He intentado utilizar:

REPLACE(ltrim(rtrim(col1)),' ',NULL) 

pero no funciona. Convierta todos los valores de col1 a NULL. Solo quiero convertir solo aquellos valores que tienen espacios vacíos al NULL.

Respuesta

32

¿Has probado esto?

UPDATE table 
SET col1 = NULL 
WHERE col1 = '' 

Como los comentaristas señalan, usted no tiene que hacer ltrim() o rtrim(), y NULL columnas no coincidirán ''.

+4

Ni siquiera es necesario utilizar RTRIM. SQL Server ignora los espacios en blanco finales al comparar cadenas. –

+0

@Bennor McCarthy: wow, realmente me estoy escapando ... voy a abandonar esa cláusula ahora – egrunin

+0

No es realmente un problema importante. No es que el rendimiento o el uso de índices sea realmente una preocupación para la consulta. Su respuesta fue correcta de todos modos. :) –

6

Tal vez algo como esto?

UPDATE [MyTable] 
SET [SomeField] = NULL 
WHERE [SomeField] is not NULL 
AND LEN(LTRIM(RTRIM([SomeField]))) = 0 
8

Una declaración de caso debe hacer el truco en la selección de su tabla de origen:

CASE 
    WHEN col1 = ' ' THEN NULL 
    ELSE col1 
END col1 

Además, una cosa a tener en cuenta es que su LTRIM y RTRIM reducen el valor de un espacio (' ') a blanco (''). Si es necesario eliminar el espacio en blanco, entonces la declaración caso debe ser modificado apropiadamente:

CASE 
    WHEN LTRIM(RTRIM(col1)) = '' THEN NULL 
    ELSE LTRIM(RTRIM(col1)) 
END col1 
-1

aquí es una expresión regular para ti.

update table 
set col1=null 
where col1 not like '%[a-z,0-9]%' 

encuentra esencialmente las columnas que no tienen letras ni números y lo establece en nulo. podría tener que actualizar si tiene columnas con solo caracteres especiales.

+2

Creo que ha respondido a su propia pregunta sobre por qué esta es una mala idea. – MikeKulls

19

SQL Server ignora los espacios en blanco al comparar cadenas, por lo que '' = ''. Sólo tiene que utilizar la siguiente consulta para su actualización

UPDATE table 
SET col1 = NULL 
WHERE col1 = '' 

valores NULL en la tabla permanecerá NULL y col1s con cualquier número de caracteres de espacio sólo se cambiarán a NULL.

Si desea hacerlo durante su copia de una mesa a otra, utilice esto:

INSERT INTO newtable (col1, othercolumn) 
SELECT 
    NULLIF(col1, ''), 
    othercolumn 
FROM table 
+0

IMO esta es la mejor respuesta. La pregunta preguntó cómo convertir las cadenas vacías en nulas durante la copia. La respuesta aceptada no es buena porque lo hace en 2 pasos que no solo es menos eficiente sino que detiene al DBA agregando una restricción para garantizar que no haya cadenas vacías. – MikeKulls

+0

Acepto que la segunda consulta aquí realmente es la respuesta que mejor coincide con la pregunta, aunque mi respuesta fue la aceptada. – egrunin

77

me resolvió un problema similar usando NULLIF función:

UPDATE table 
SET col1 = NULLIF(col1, '') 

From the T-SQL reference:

NULLIF devuelve la primera expresión si las dos expresiones no son iguales. Si las expresiones son iguales, NULLIF devuelve un valor nulo del tipo de la primera expresión.

+0

http://technet.microsoft.com/en-us/library/ms177562.aspx –

+3

La principal desventaja de esto es que todas las filas en la tabla se actualizarán en lugar de solo las filas que necesitan el cambio. – Trisped

+1

@Trisped: Claro, pero es una gran opción para aquellos de nosotros que buscamos hacer algo similar en una declaración 'INSERT'. – Ellesedil

7

Este código genera un poco de SQL que se puede lograr esto en cada mesa y columna en la base de datos:

SELECT 
    'UPDATE ['+T.TABLE_SCHEMA+'].[' + T.TABLE_NAME + '] SET [' + COLUMN_NAME + '] = NULL 
    WHERE [' + COLUMN_NAME + '] = ''''' 
FROM 
    INFORMATION_SCHEMA.columns C 
INNER JOIN 
    INFORMATION_SCHEMA.TABLES T ON C.TABLE_NAME=T.TABLE_NAME AND C.TABLE_SCHEMA=T.TABLE_SCHEMA 
WHERE 
    DATA_TYPE IN ('char','nchar','varchar','nvarchar') 
AND C.IS_NULLABLE='YES' 
AND T.TABLE_TYPE='BASE TABLE' 
+1

su script es genial, también puede agregar: 'WHERE ['+ COLUMN_NAME +'] '+' NO ME GUSTA '+' ''% [az, 0-9]% '' '' – GeorgesC

+0

Gracias, ¿qué significa eso? Regex hacer? – gls123

Cuestiones relacionadas