【问题标题】:SQL replace all NULLsSQL 替换所有 NULL
【发布时间】:2011-10-28 14:45:18
【问题描述】:

我有一张大表,里面有一些 NULL。从表中选择 0 而不是 NULL 的最简单方法是什么。

或者如果没有简单的方法可以做到这一点,我愿意用 0 物理替换表中的所有空值。

有很多列,我不想用 ISNULL(FieldName,0) AS FieldName 之类的东西逐一遍历。

【问题讨论】:

    标签: sql sql-server sql-server-2005


    【解决方案1】:

    正如这里的许多人所说,最好的方法是 ISNULL(),但是如果您想要一种简单的方法来生成所有这些 ISNULL(),请使用以下代码:

    SELECT 'ISNULL([' + COLUMN_NAME + '], ' + 
      CASE 
        WHEN DATA_TYPE = 'bit' THEN '0'
        WHEN DATA_TYPE = 'int' THEN '0'
        WHEN DATA_TYPE = 'decimal' THEN '0'
        WHEN DATA_TYPE = 'date' THEN '''1/1/1900'''
        WHEN DATA_TYPE = 'datetime' THEN '''1/1/1900'''
        WHEN DATA_TYPE = 'uniqueidentifier' THEN '00000000-0000-0000-0000-000000000000'
        ELSE '''''' -- everything else get's an empty string
      END + ') AS [' + COLUMN_NAME + '],'
    FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'TableName'
    

    这将使繁琐的工作变得容易得多,然后您只需编辑输出以考虑各种字段类型(int、varchar、日期等)

    编辑:使用默认值考虑各种数据类型..

    【讨论】:

    • 您还必须考虑列类型,因为数字 0 不是所有列类型的有效替换值
    • 已更新以适应 ;) 当然我可能错过了一个类型..但这真的取决于他都在使用什么..
    • 我只是要编写一个函数来构建正确的查询,但如果这样可行,它可能是最好的解决方案。
    【解决方案2】:

    你真的有两个选择

    ISNULL(yourColumn,0) AS columnName
    

    或实际解决问题并将所有 NULL 数据更改为 0

    UPDATE table
    SET column = 0
    WHERE
    column IS NULL    -- remember "column = NULL" always equates to NULL!
    

    当你这样做时,不要忘记 WHERE,否则一切都会变成 0!

    【讨论】:

    • 第二种方案是合理的;很惊讶没有更多 +1。
    • 感谢您提醒您在哪里。去过那里!
    • 当然,使用 Alt 键一次选择和编辑多行可以大大减少繁琐!
    【解决方案3】:

    您必须在 SELECT 语句中手动指定每一列并使用 ISNULL() 函数:

    SELECT ISNULL(columnName, 0), ... yes all of them
    

    【讨论】:

    • 这正是他说他不想做的事!
    • 是的,正如我所提到的,我已经考虑过这个解决方案。我真的很惊讶人们没有更频繁地发布我的问题。似乎有一个更简单的解决方案。
    • @Alec “更简单”的解决方案是在第一次创建表时将列指定为 NOT NULL DEFAULT 0
    • @sll : 或者学会喜欢我们必须做的事情 ;-) 数据中的 Null 对零有单独的含义。
    【解决方案4】:

    尽管你不愿意这样做,

    ISNULL(FieldName,0) AS FieldName
    

    对于每一列都是正确的处理方法。

    【讨论】:

      【解决方案5】:

      当老板。像这样写:

      select 'update ' + table_name + ' set [' + column_name + '] = '''' where [' + column_name + '] is null'
      from tempdb.information_schema.columns
      where table_name = 'YourTableName'
      

      它会为你吐出一个很大的查询。

      【讨论】:

        【解决方案6】:

        除了ISNULL,您还可以使用COALESCE,它与ANSI SQL 兼容。

        select coalesce(yourcolumn, 0)
        

        有很多列,我不想用 ISNULL(FieldName,0) AS FieldName 之类的东西逐一遍历。

        你不能总是得到你想要的。太糟糕了。这是要走的路:逐列。

        【讨论】:

          【解决方案7】:

          如您所说,不浏览每一列并不容易。

          NULL 对 0 具有特殊而独特的含义。它表示没有值或未知,而不是已知的零值。一些数据库纯粹主义者会争辩说,表中的一行根本不应该有 NULL!

          如果源表中的 NULL 确实意味着零,则更改它们,否则在它们通过查询传播时处理它们。

          【讨论】:

            【解决方案8】:

            我不想用 ISNULL(FieldName,0) AS FieldName 之类的东西遍历每一个。

            每个人都这样做一次

            ALTER TABLE TableName ALTER COLUMN FieldName INTEGER DEFAULT 0 NOT NULL;
            

            然后你就可以忘记ISNULLCOALESCE、三值逻辑等。

            【讨论】:

              【解决方案9】:

              我想要一个动态查询来执行更新选项。借用上面的帖子和another我有以下内容:

                          USE [YOUR DATABASE] 
                          DECLARE @tableName nvarchar(100) 
                          DECLARE @name varchar(50) 
                          DECLARE @dtype varchar(50) 
                          DECLARE @CMD NVARCHAR (200) 
              
                          SET @tableName = [YOUR TABLE NAME] 
              
              
                          DECLARE db_cursor CURSOR FOR 
              
                                SELECT c.name, t.name AS Dtype 
                                FROM sys.columns c 
                                INNER JOIN sys.types t 
                                ON t.system_type_id = c.system_type_id 
                                WHERE c.[object_id] = 
                                    (SELECT [object_id] FROM sys.objects WHERE type = 'U' AND [NAME] = @tableName) 
              
                          OPEN db_cursor 
                          FETCH NEXT FROM db_cursor INTO @name, @Dtype 
              
                          WHILE @@FETCH_STATUS = 0 BEGIN
              
                          SET @CMD = 'UPDATE ' + @tableName + ' SET ' + quotename(@name) +' = ' + 
              
                             (CASE 
                               WHEN (@Dtype = 'bit') THEN '0' 
                               WHEN (@Dtype = 'int') THEN '0' 
                               WHEN (@Dtype = 'decimal') THEN '0' 
                               WHEN (@Dtype = 'date') THEN '''1/1/1900''' 
                               WHEN (@Dtype = 'datetime') THEN '''1/1/1900'''
                               WHEN (@Dtype = 'uniqueidentifier') THEN '00000000-0000-0000-0000-000000000000' 
                            ELSE '''''' 
                            END ) 
                          + ' WHERE ' + quotename(@name) +' IS NULL' 
              
                          PRINT @CMD 
              
                          EXEC sp_executeSQL @cmd 
              
                          FETCH NEXT FROM db_cursor INTO @name, @Dtype 
              
                          END 
              
                          CLOSE db_cursor 
                          DEALLOCATE db_cursor
              

              【讨论】:

                猜你喜欢
                • 2021-01-02
                • 2022-01-24
                • 1970-01-01
                • 2022-11-22
                • 2020-09-05
                • 2021-04-04
                • 2020-01-12
                • 1970-01-01
                • 2021-10-24
                相关资源
                最近更新 更多