SQL替换所有NULL

时间:2011-10-28 14:45:18

标签: sql sql-server sql-server-2005

我有一个大表,里面有一些NULL。从表中选择0而不是NULL的最简单方法是什么。

或者如果没有简单的方法可以做到这一点,我愿意用表中的0替换所有空值。

有很多列,我不想通过像ISNULL(FieldName,0)AS FieldName这样的内容遍历每一列。

9 个答案:

答案 0 :(得分:15)

正如许多人所说,最好的方法是ISNULL(),但是如果你想要一个简单的方法来生成所有那些ISNULL(),请使用以下代码:

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'

这将使繁琐的工作变得更加容易,然后您只需编辑输出以考虑各种字段类型(int,varchar,date等)

编辑:使用默认值计算各种数据类型..

答案 1 :(得分:8)

你真的有两个选择

ISNULL(yourColumn,0) AS columnName

或实际修复问题并将所有NULL数据更改为0

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

当你这样做时不要忘记WHERE或者一切都会变成0!

答案 2 :(得分:3)

您必须在SELECT语句中手动指定每一列并使用ISNULL()函数:

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

答案 3 :(得分:1)

尽管你不愿意这样做,

ISNULL(FieldName,0) AS FieldName
每列的

是处理此问题的正确方法。

答案 4 :(得分:1)

做老板。写下类似的东西:

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

它会为你吐出一个大问题。

答案 5 :(得分:0)

除了ISNULL之外,您可以使用与ANSI SQL兼容的COALESCE

select coalesce(yourcolumn, 0)
  

有很多列,我不想通过像ISNULL(FieldName,0)AS FieldName这样的内容遍历每一列。

你不能总是得到你想要的东西。太糟糕了。这是要走的路:逐列。

答案 6 :(得分:0)

如你所说的那样,不经过每一栏就不容易。

NULL对0具有特殊且不同的含义。它表示没有值或未知,而不是已知的零值。一些数据库纯粹主义者认为表中的行根本不应该有NULL!

如果源表中的NULL确实为零,则更改它们,否则在它们通过您的查询传播时处理空值。

答案 7 :(得分:0)

  

我不想用ISNULL(FieldName,0)AS FieldName之类的东西来浏览每一个。

点击一下,为每一个执行一次

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

然后,您可以忘记ISNULLCOALESCE,三值逻辑等所有内容。

答案 8 :(得分:0)

我想要一个动态查询来执行更新选项。借用上面的帖子和another我有以下内容:

            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