Pregunta

Tengo una tabla y las columnas de esta tabla contiene espacios vacíos para algunos registros. Ahora necesito para mover los datos a otra tabla y sustituir los espacios vacíos con un valor NULL.

Me trató de usar:

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

pero no funciona. Se convertirá todos los valores de col1 a NULL. Sólo quiero convertir sólo aquellos valores que tienen espacios vacíos a NULL.

¿Fue útil?

Solución

¿Usted intentó esto?

UPDATE table 
SET col1 = NULL 
WHERE col1 = ''

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

Otros consejos

I resolvió un problema similar usando la función NULLIF:

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

De la referencia T-SQL:

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.

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

UPDATE table
SET col1 = NULL
WHERE col1 = ''

Los valores NULL en su mesa se quedará nulo, 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 la siguiente:

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

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'

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 la nota 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

Tal vez algo como esto?

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

aquí está una expresión regular para ti.

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

encuentra esencialmente cualquier columna que no dispongamos de letras o números en ellas y se pone a NULL. podría tener que actualización si tiene columnas con caracteres especiales solo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top