2011-09-22 92 views
2

我對sql很陌生。我在這個項目上,我必須檢查是否有空,如果它是我必須將其更改爲零,但有很多表,我必須做這個和許多列。我想知道是否有一種方法可以檢查整個表的空值而不是檢查每個表的每一列。SQL查詢空值問題

+0

什麼平臺? MS SQL Server,MySQL,Oracle ..? –

+0

很酷的照片:-P要檢查列'a'使用'a是NULL',例如'update table set a = 0 where a is NULL'。 – TMS

+0

你確定它只是SQL。你不使用SQL的任何編程語言ontop? –

回答

2

米歇爾,不,你需要檢查每一列NULLS。更大的問題是爲什麼NULLS被允許?雖然我不是在數據庫中永不擁有NULLS的擁護者(我相信他們有他們的目的),但表中過多的NULL值是數據庫未正常標準化或具有其他體系結構問題的良好指標。

+0

我不認爲他們說有過多的數額,只是很多表,他們不想單獨檢查每個字段。 –

+0

是的歐文多數民衆贊成在我的意思是對我缺乏溝通感到抱歉。 – Michelle

+0

「正常化」本質上沒有意義。建議的替代: 「歸一化」 是指[1NF](http://en.wikipedia.org/wiki/First_normal_form)或更高, 「完全正常化」 是指[5NF](http://en.wikipedia.org/wiki/Fifth_normal_form ) 或更高。 – onedaywhen

0

你說你必須將任何NULL值更改爲0,所以也許最簡單的方法是使用COALESCE(value, 0)

COALESCE(value, value2, value3)是一個快捷方式CASE語句像

CASE 
    WHEN value1 IS NOT NULL THEN value1 
    WHEN value2 IS NOT NULL THEN value2 
    ... 
END 

編輯: 如果你真的要更新所有NULLS爲0桌子上,你可以做下面的SQL語句:

SELECT 'UPDATE ' 
     + OBJECT_NAME(OBJECT_ID) 
     + ' SET ' 
     + sc.name 
     + ' = 0 WHERE ' 
     + sc.name 
     + ' IS NULL'   
FROM sys.columns sc 
     INNER JOIN sys.types st ON st.system_type_id = sc.system_type_id 
WHERE st.name IN ('bigint', 'int', 'smallint')   
     AND OBJECT_NAME(OBJECT_ID) = 'YourTable' 

這將產生一個文本字符串,您應該能夠複製和粘貼並運行,或者以循環方式編程運行。它取決於具有數字數據類型的列,如果您有任何實際上希望保留爲NULL的列的話,這可能會很危險。您可以取出WHERE子句的最後部分來爲所有表運行它,但您可能需要事先進行測試和驗證。

我沒有準備好測試的SQL Server實例,所以這帶有通用的「自擔風險」免責聲明。 :-)

+0

這不會識別*哪列*是NULL ,只有當所有的列都是NULL或NOT NULL。 OP仍然需要識別「NULL」列以更新爲零。 – Wil

+0

@Wil,我更新了答案,包括(暴力破解,有點hackish的)任何更新數字列0,如果它是空的路。 – bhamby

0

它取決於平臺,但在某些情況下,您可以使用系統表信息來獲取所有列的列表,並利用它來生成查詢以驗證每個表中的每個列。

但是,這將是相當黑客。真正的問題是a)爲什麼會有這麼多的空值(可能有很好的理由,但它確實表明結構是錯誤的,如每Wil)和b)爲什麼突然需要改變,然後全部爲零?這隻適用於數字字段嗎?在明確的解決方案變得清晰之前,還有很多其他問題需要您提出。

0
Select nvl(col,'0') from table ; 

NVL將在oracle中正常工作。

NVL將檢查col是否爲空,如果它爲空則會將其更改爲零。