SQL查询空值问题

问题描述:

我对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? –

米歇尔,不,你需要检查每一列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

你说你必须将任何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

它取决于平台,但在某些情况下,您可以使用系统表信息来获取所有列的列表,并利用它来生成查询以验证每个表中的每个列。

但是,这将是相当黑客。真正的问题是a)为什么会有这么多的空值(可能有很好的理由,但它确实表明结构是错误的,如每Wil)和b)为什么突然需要改变,然后全部为零?这只适用于数字字段吗?在明确的解决方案变得清晰之前,还有很多其他问题需要您提出。

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

NVL将在oracle中正常工作。

NVL将检查col是否为空,如果它为空则会将其更改为零。