Cómo convertir los espacios vacíos en los valores nulos, el uso de SQL Server?
-
02-10-2019 - |
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
.
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, '')
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.