我有它的一些空值一大桌。使用0而不是NULL來從表中選擇最簡單的方法是什麼?SQL替換所有空值
或者,如果有沒有簡單的方法來做到這一點,我願意與物理0的替換表中所有的空值。
有很多欄目,我不希望要經過每一個與像ISNULL(字段名,0)作爲字段名。
我有它的一些空值一大桌。使用0而不是NULL來從表中選擇最簡單的方法是什麼?SQL替換所有空值
或者,如果有沒有簡單的方法來做到這一點,我願意與物理0的替換表中所有的空值。
有很多欄目,我不希望要經過每一個與像ISNULL(字段名,0)作爲字段名。
如同這裏許多人說,最好的辦法是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,日期等)
編輯:佔默認值的各種數據類型..
儘管你不願意這樣做,
ISNULL(FieldName,0) AS FieldName
爲每列是正確的操作方法。
你有兩種選擇真的
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。 –
感謝您關於在哪裏的提醒。去過也做過! –
或者到ISNULL
,您可以用COALESCE
,這是ANSI SQL兼容。
select coalesce(yourcolumn, 0)
有很多欄目,我不希望要經過每一個與像ISNULL(字段名,0)作爲字段名。
你不能總是得到你想要的東西。太糟糕了。這是要走的路:逐列。
不通過每一列就不容易做到這一點如你所說。
NULL具有特殊和獨特的含義爲0。這意味着沒有價值或未知相對於一個已知的零值。一些數據庫純粹主義者會爭辯說,表中的行不應該有NULL!
如果你的源表中的NULL真的是零,然後改變它們,否則與空處理,因爲他們通過你的查詢傳播完成。
我不想通過像ISNULL(FieldName,0)AS FieldName這樣的東西去遍歷每一個。
取命中和做一次爲每一位:
ALTER TABLE TableName ALTER COLUMN FieldName INTEGER DEFAULT 0 NOT NULL;
然後,您可以忘記所有關於ISNULL
,COALESCE
,三值邏輯等
當老闆。寫這樣的:
select 'update ' + table_name + ' set [' + column_name + '] = '''' where [' + column_name + '] is null'
from tempdb.information_schema.columns
where table_name = 'YourTableName'
它會吐出一個大醇'查詢你。
我想要一個動態查詢來執行更新選項。從上面的帖子借用和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
你也必須考慮列類型,因爲數字'0'不是所有列類型的有效替代值 – sll
已更新以適應;)當然,我可能錯過了一個類型..但這真的取決於他所有使用.. –
我只是要編寫一個函數來建立正確的查詢,但如果這樣做,它可能是最好的解決方案。 – Alec