2011-10-28 110 views
7

我有它的一些空值一大桌。使用0而不是NULL来从表中选择最简单的方法是什么?SQL替换所有空值

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

有很多栏目,我不希望要经过每一个与像ISNULL(字段名,0)作为字段名。

回答

14

如同这里许多人说,最好的办法是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,日期等)

编辑:占默认值的各种数据类型..

+0

你也必须考虑列类型,因为数字'0'不是所有列类型的有效替代值 – sll

+0

已更新以适应;)当然,我可能错过了一个类型..但这真的取决于他所有使用.. –

+0

我只是要编写一个函数来建立正确的查询,但如果这样做,它可能是最好的解决方案。 – Alec

3

你必须在SELECT语句来手动指定每一列和使用ISNULL()功能:

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

这正是他说他不想做的! –

+2

@webturner:有时我们必须做我们不喜欢的事情...... – sll

+0

是的我已经考虑过这个解决方案,正如我所提到的。我真的很惊讶,人们不会经常发布我的问题。似乎会有一个更简单的解决方案。 – Alec

1

尽管你不愿意这样做,

ISNULL(FieldName,0) AS FieldName 

为每列是正确的操作方法。

4

你有两种选择真的

ISNULL(yourColumn,0) AS columnName 

或实际解决这个问题,所有的NULL数据更改为0

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

当你这样做不要忘了在哪里,一切都将结束为0!

+1

第二种解决方案是合理的;惊讶没有更多的+1。 –

+0

感谢您关于在哪里的提醒。去过也做过! –

0

或者到ISNULL,您可以用COALESCE,这是ANSI SQL兼容。

select coalesce(yourcolumn, 0) 

有很多栏目,我不希望要经过每一个与像ISNULL(字段名,0)作为字段名。

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

0

不通过每一列就不容易做到这一点如你所说。

NULL具有特殊和独特的含义为0。这意味着没有价值或未知相对于一个已知的零值。一些数据库纯粹主义者会争辩说,表中的行不应该有NULL!

如果你的源表中的NULL真的是零,然后改变它们,否则与空处理,因为他们通过你的查询传播完成。

0

我不想通过像ISNULL(FieldName,0)AS FieldName这样的东西去遍历每一个。

取命中和做一次为每一位:

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

然后,您可以忘记所有关于ISNULLCOALESCE,三值逻辑等

0

当老板。写这样的:

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

它会吐出一个大醇'查询你。

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