我对sql很新。我正在这个项目,我必须检查是否有东西是否为空,如果是,我必须将其更改为零,但有许多表,我将不得不这样做和许多列。我想知道是否有一种方法可以检查整个表的空值而不是检查每个表的每一列。
答案 0 :(得分:2)
Michelle,你不需要检查NULLS
的每一栏。更大的问题是为什么NULLS
被允许?虽然我不是一个从不在数据库中拥有NULLS
的倡导者(我相信它们有其目的),但表中过多的NULL
值是数据库不是很好的指标正常化或有其他架构问题。
答案 1 :(得分: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实例,因此这附带了通用的“使用风险自负”免责声明。 : - )
答案 2 :(得分:0)
它确实依赖于平台,但在某些情况下,您可以使用系统表信息来获取所有列的列表,并利用它来生成查询以验证每个表中的每一列。
然而,这将是一个非常黑客。真正的问题是:a)为什么有这么多的空值(可能有很好的理由,但它确实表明结构是错误的,按照Wil)和b)为什么突然需要将所有变为零?这仅适用于数字字段吗?在明确的解决方案变得明确之前,您还需要提出许多其他问题。
答案 3 :(得分:0)
Select nvl(col,'0') from table ;
NVL在oracle中运行良好。
NVL将检查col
是否为空,如果为空,则将其更改为零。