代码之家  ›  专栏  ›  技术社区  ›  Greg Bray

使用列级WHERE子句更新多个列中的所有SQL空值?

  •  7
  • Greg Bray  · 技术社区  · 15 年前

    我们有一个数据库,里面有一堆宽表(每个40-80列),刚刚发现一个错误,在大约500条记录中引入了空值。空值可以出现在任何列中(所有列都是整型列,见下图),但这些空值会导致我们的一个报告系统出现问题,无法轻易更改。我们需要用一个特定的静态值(在本例中是99)替换空值,但是由于必须对超过250个不同的列按列进行更改,所以我不希望编写单独的TSQL脚本逐个更新每列。

    现在我的大脑太紧张,无法想出一个聪明的解决方案,所以我的问题是如何使用一个简单易读的SQL查询在一个表(或者更好的是多个表)上的所有列上执行此任务。我可以很容易地用 WHERE (Answer_1 IS NULL) OR (Answer_2 IS NULL) OR ... 或者甚至是每个表的AdministrationID号,但是当更新为每行而不是每列的where子句时,这个技巧不起作用。有什么建议吗?

    下面是一个示例查询,显示了4个不同表中的一些记录: Sample

    4 回复  |  直到 14 年前
        1
  •  22
  •   OMG Ponies    15 年前

    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 = ...
    

    逻辑是,只有当列值为空时,该值才会更新为99,这是因为COALESCE是如何工作的——返回第一个非空值(处理从左到右提供的列表)。

        2
  •  4
  •   jason saldo    15 年前

    javascript:sql='update your table set ';x=0;while(x <= 40){sql += 'answer_'+x+ ' = coalesce(answer_'+x+',99),\n';x++;};alert(sql);
    
        3
  •  4
  •   Mihai    12 年前

    只需轮询每个表的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
    
        4
  •  2
  •   Ashish Patel    15 年前

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

    推荐文章