2011-10-28 159 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