2011-10-28 9 views
7

Tengo una gran tabla con algunos NULL en ella. ¿Cuál es la forma más fácil de seleccionar de la tabla con 0 en lugar de NULL?SQL reemplaza todos los NULL

O si no hay una manera fácil de hacerlo, estoy dispuesto a reemplazar físicamente todos los nulos con 0 en la tabla.

Hay muchas columnas, no quiero tener que pasar por cada una con algo como ISNULL (FieldName, 0) AS FieldName.

Respuesta

14

Como muchos aquí han dicho, el mejor enfoque es ISNULL(), sin embargo si quieres una forma fácil de generar todos los ISNULL() 's utilizar el siguiente código:

SELECT 'ISNULL([' + COLUMN_NAME + '], ' + 
    CASE 
    WHEN DATA_TYPE = 'bit' THEN '0' 
    WHEN DATA_TYPE = 'int' THEN '0' 
    WHEN DATA_TYPE = 'decimal' THEN '0' 
    WHEN DATA_TYPE = 'date' THEN '''1/1/1900''' 
    WHEN DATA_TYPE = 'datetime' THEN '''1/1/1900''' 
    WHEN DATA_TYPE = 'uniqueidentifier' THEN '00000000-0000-0000-0000-000000000000' 
    ELSE '''''' -- everything else get's an empty string 
    END + ') AS [' + COLUMN_NAME + '],' 
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'TableName' 

Esto hará que la tedioso trabajo mucho más fácil, a continuación, sólo tiene que editar la salida para dar cuenta de los diferentes tipos de campo (int, varchar, fechas, etc.)

Editar: representando diversos tipos de datos con los valores por defecto ..

+0

También debe considerar el tipo de columna ya que el valor '0' numérico no es válido para todos los tipos de columnas – sll

+0

Actualizado para acomodar;) por supuesto, podría haber perdido un tipo ... pero eso realmente depende de lo que esté usando. –

+0

Voy a escribir una función para crear la consulta correcta, pero si esto funciona, probablemente sea la mejor solución. – Alec

3

Tiene que especificar manualmente cada columna en la sentencia SELECT y utilizar ISNULL() función:

SELECT ISNULL(columnName, 0), ... yes all of them 
+2

eso es exactamente lo que dijo que no quería hacer! –

+2

@webturner: a veces debemos hacer lo que no nos gusta ... – sll

+0

Sí, ya he considerado esta solución como mencioné. Estoy realmente sorprendido de que la gente no publique mi pregunta más a menudo. Parece que habría una solución más simple. – Alec

1

A pesar de su renuencia a hacerlo,

ISNULL(FieldName,0) AS FieldName 

para cada columna es la forma correcta de manejar esto .

4

Tiene dos opciones realmente

ISNULL(yourColumn,0) AS columnName 

o para fijar realmente el problema y cambiar todos los datos NULL a 0

UPDATE table 
SET column = 0 
WHERE 
column IS NULL -- remember "column = NULL" always equates to NULL! 

Al hacer esto no se olvide el WHERE o todo va a terminar ¡siendo 0!

+1

Esta segunda solución es razonable; sorprendido, no hay más +1. –

+0

Gracias por el recordatorio de dónde. He estado allí hecho eso! –

0

Alternativamente a ISNULL, puede usar COALESCE, que es compatible con ANSI SQL.

select coalesce(yourcolumn, 0) 

hay un montón de columnas, yo no quiero tener que ir a través de cada uno de ellos con algo como ISNULL (NombreCampo, 0) como NombreCampo.

No siempre puede obtener lo que desea. Demasiado. Este es el camino a seguir: columna por columna.

0

No es fácil hacerlo sin pasar por cada columna solo como dijiste.

NULL tiene un significado especial y distinto a 0. Significa que no hay ningún valor o valor desconocido en comparación con un valor cero conocido. ¡Algunos puristas de bases de datos argumentarían que una fila en una tabla no debería tener valores NULL en absoluto!

Si los NULL en su tabla fuente realmente significan cero, cámbielos, de lo contrario, trate los nulos a medida que se propagan a través de sus consultas.

0

No quiero tener que revisar cada uno con algo como ISNULL (FieldName, 0) AS FieldName.

soportar el golpe y hacer esto una vez para cada uno:

ALTER TABLE TableName ALTER COLUMN FieldName INTEGER DEFAULT 0 NOT NULL; 

A continuación, puede olvidarse de ISNULL, COALESCE, la lógica trivalente, etc.

0

ser un jefe . Escriba algo como:

select 'update ' + table_name + ' set [' + column_name + '] = '''' where [' + column_name + '] is null' 
from tempdb.information_schema.columns 
where table_name = 'YourTableName' 

Va a escupir una gran pregunta para usted.

0

Quería una consulta dinámica para hacer la opción de actualización. Inspirándose en el post anterior y another Tengo el siguiente:

  USE [YOUR DATABASE] 
      DECLARE @tableName nvarchar(100) 
      DECLARE @name varchar(50) 
      DECLARE @dtype varchar(50) 
      DECLARE @CMD NVARCHAR (200) 

      SET @tableName = [YOUR TABLE NAME] 


      DECLARE db_cursor CURSOR FOR 

        SELECT c.name, t.name AS Dtype 
        FROM sys.columns c 
        INNER JOIN sys.types t 
        ON t.system_type_id = c.system_type_id 
        WHERE c.[object_id] = 
         (SELECT [object_id] FROM sys.objects WHERE type = 'U' AND [NAME] = @tableName) 

      OPEN db_cursor 
      FETCH NEXT FROM db_cursor INTO @name, @Dtype 

      WHILE @@FETCH_STATUS = 0 BEGIN 

      SET @CMD = 'UPDATE ' + @tableName + ' SET ' + quotename(@name) +' = ' + 

       (CASE 
       WHEN (@Dtype = 'bit') THEN '0' 
       WHEN (@Dtype = 'int') THEN '0' 
       WHEN (@Dtype = 'decimal') THEN '0' 
       WHEN (@Dtype = 'date') THEN '''1/1/1900''' 
       WHEN (@Dtype = 'datetime') THEN '''1/1/1900''' 
       WHEN (@Dtype = 'uniqueidentifier') THEN '00000000-0000-0000-0000-000000000000' 
       ELSE '''''' 
       END) 
      + ' WHERE ' + quotename(@name) +' IS NULL' 

      PRINT @CMD 

      EXEC sp_executeSQL @cmd 

      FETCH NEXT FROM db_cursor INTO @name, @Dtype 

      END 

      CLOSE db_cursor 
      DEALLOCATE db_cursor 
Cuestiones relacionadas