2010-10-15 28 views
7

我们有一大堆宽表(每个40-80列)有一个数据库,并且刚刚发现一个将NULL值引入大约500条记录的错误。 NULL值可以出现在任何列中(所有列都是整数列,请参见下图),但这些NULL值导致我们的某个报告系统无法轻松更改的问题。我们需要用一个特定的静态值(在本例中为99)替换NULL值,但是由于这个改变必须以250列以上的每列为基础进行,所以我宁愿不编写单独的TSQL脚本来更新每列一个。使用列级别WHERE子句更新多列中的所有SQL NULL值?

我的大脑现在太炒了一个聪明的解决方案,所以我的问题是如何使用简单和可读的SQL查询在一个表(或更好的多个表)上的所有列上执行此任务。我可以使用连锁WHERE (Answer_1 IS NULL) OR (Answer_2 IS NULL) OR ...甚至每个表的管理ID号隔离足够容易的记录,但在更新时,此子句不适用于每列不是每列的where子句。有什么建议?

这是从4页不同的表数的记录的查询示例: Sample

+1

这真的很糟糕。 – 2010-10-15 02:05:55

+0

我想我会添加一个非空约束与每个列的默认值99? – njzk2 2012-05-03 15:48:49

+0

我看着这个,问自己为什么列不是以下内容:管理ID,InstrumentID,AnswerID,值。哎呀,你甚至可以添加另一个ID,以便您可以将所有这些表合并为1 ... – 2017-10-10 07:29:53

回答

21

没有任何约定,这一点 - 如果你想只处理记录,其中各列是NULL,你需要使用:

WHERE Answer_1 IS NULL 
    OR Answer_2 IS NULL 
    OR ... 

但是你可以在UPDATE语句使用:

UPDATE YOUR_TABLE 
    SET col1 = COALESCE(col1, 99), 
     col2 = COALESCE(col2, 99), 
     col3 = ... 

的LOGI c是因为COALESCE的工作方式 - 仅返回第一个非NULL值(处理从左到右提供的列表),所以值只有在列值为NULL时才会更新为99。

+0

+1 - 我一定很累,我试图用'CASE'声明来做这个... O_o – LittleBobbyTables 2010-10-15 02:09:54

+0

+1合并。 – 2010-10-15 02:11:52

+2

而且很明显,这些列都是'Answer_'格式,因此Greg应该能够很快地在Excel中快速打出脚本 – LittleBobbyTables 2010-10-15 02:16:29

3

只是为每个表轮询sys.columns表并创建一些动态sql ...这是蛮力,但它使您不必编写所有t-sql。

例如:

DECLARE @TABLENAME AS VARCHAR(255) 

SET @TABLENAME = 'ReplaceWithYourTableName' 

SELECT 'UPDATE ' + @TableName + ' SET ' + CAST(Name AS VARCHAR(255)) + ' = 99 
WHERE ' + CAST(Name AS VARCHAR(255)) + ' IS NULL' 
FROM sys.columns 
WHERE object_id = OBJECT_ID(@TABLENAME) 
    AND system_type_id = 56 -- int's only 
+0

我部分同意Ashish Patel在ISNULL上。您应该清理报告环境的数据并提供必要的默认值以简化报告sql IMO。我认为ISNULL是一个标量函数来启动,这是同样糟糕的性能(我似乎无法通过谷歌搜索来确认这个假设:))如果列不应该是NULL,那么也许模式应该更改为不允许在数据库级别添加NULL或缺省值。再次,这超出了问题的范围,可能只是归结为每个商店的编码标准。 – 2010-10-15 03:08:30

4

既然你已经做到这一点所有的地方我写一些JavaScript来帮助你构建SQL。剪切并粘贴到你的浏览器地址栏来获取你的SQL。

javascript:sql='update your table set ';x=0;while(x <= 40){sql += 'answer_'+x+ ' = coalesce(answer_'+x+',99),\n';x++;};alert(sql); 
2

我不喜欢为报告目的而操纵数据本身的想法。如果您将NULL值更改为99以便简化报告,那么我认为该数据已损坏。如果除报告之外还有其他消费者需要真正的数据呢?

我宁愿为报告写一个智能查询。例如,如果使用ISNULL(columnname,99),那么只要列值为NULL,它就会返回99。

+1

我通常会同意,但在这种情况下,NULL值是错误地添加的,而不是使用99的正确值。另外,更改报告查询不是一个选项,因为它是专有报告系统。 – 2010-10-15 03:24:27