【问题标题】:How to convert empty spaces into null values, using SQL Server?如何使用 SQL Server 将空格转换为空值?
【发布时间】:2011-04-11 17:40:49
【问题描述】:

我有一个表,该表上的列包含一些记录的空格。现在我需要将数据移动到另一个表并用NULL 值替换空格。

我尝试使用:

REPLACE(ltrim(rtrim(col1)),' ',NULL)

但它不起作用。它会将col1 的所有值转换为NULL。我只想将那些有空格的值转换为NULL

【问题讨论】:

    标签: sql-server null is-empty


    【解决方案1】:

    我使用NULLIF函数解决了类似的问题:

    UPDATE table 
    SET col1 = NULLIF(col1, '')
    

    From the T-SQL reference:

    NULLIF 如果两个表达式不相等,则返回第一个表达式。如果表达式相等,NULLIF 返回第一个表达式类型的空值。

    【讨论】:

    • 这样做的主要缺点是表中的所有行都将被更新,而不仅仅是需要更改的行。
    • 如果您在存在非空字符串时还对列进行其他更新,或者如果您在 INSERT 语句中使用它,这是一个不错的选择
    【解决方案2】:

    你试过了吗?

    UPDATE table 
    SET col1 = NULL 
    WHERE col1 = ''
    

    正如评论者指出的那样,您不必执行ltrim()rtrim(),并且NULL 列将不匹配''

    【讨论】:

    • 您甚至不需要使用 RTRIM。 SQL Server 在比较字符串时忽略尾随空格。
    • @Bennor McCarthy:哇,我真的滑倒了……现在要放弃那个条款
    • 不是真正的大问题。这并不像性能或索引的使用真的是查询的关注点。无论如何,您的答案仍然是正确的。 :)
    • 如果表有一个禁止空字符串的约束(如果您只使用空值,这是一个好主意),这将失败。复制过程中最好用NULLIF函数去掉空字符串。
    • @MikeKulls:他似乎暗示该表没有这样的约束。就我个人而言,我总是尽量避免在数据记录中使用NULL,因为这样程序逻辑就必须注意它们。
    【解决方案3】:

    SQL Server 在比较字符串时忽略尾随空格,因此 ' ' = ''。只需使用以下查询进行更新

    UPDATE table
    SET col1 = NULL
    WHERE col1 = ''
    

    您的表中的 NULL 值将保持为 NULL,并且带有任何数字的仅空格字符的 col1s 将更改为 NULL。

    如果您想在从一个表复制到另一个表期间执行此操作,请使用以下命令:

    INSERT INTO newtable ( col1, othercolumn )
    SELECT
       NULLIF(col1, ''),
       othercolumn
    FROM table
    

    【讨论】:

    • IMO 这是最好的答案。该问题询问如何在复制过程中将空字符串转换为 null。接受的答案不好,因为它分两步完成,不仅效率较低,而且会阻止 DBA 添加约束以确保没有空字符串。
    • 我同意这里的第二个查询确实是与问题最匹配的答案,即使我的答案是被接受的。
    【解决方案4】:

    这段代码生成了一些 SQL,可以在数据库中的每个表和列上实现这一点:

    SELECT
       'UPDATE ['+T.TABLE_SCHEMA+'].[' + T.TABLE_NAME + '] SET [' + COLUMN_NAME + '] = NULL 
       WHERE [' + COLUMN_NAME + '] = '''''
    FROM 
        INFORMATION_SCHEMA.columns C
    INNER JOIN
        INFORMATION_SCHEMA.TABLES T ON C.TABLE_NAME=T.TABLE_NAME AND C.TABLE_SCHEMA=T.TABLE_SCHEMA
    WHERE 
        DATA_TYPE IN ('char','nchar','varchar','nvarchar')
    AND C.IS_NULLABLE='YES'
    AND T.TABLE_TYPE='BASE TABLE'
    

    【讨论】:

    • 你的脚本很棒,你也可以添加:` WHERE [' + COLUMN_NAME + '] ' + 'NOT LIKE ' + '''%[az,0-9]%''' `
    • 谢谢,这个正则表达式是做什么的?
    【解决方案5】:

    从源表中选择时,case 语句应该可以解决问题:

    CASE
      WHEN col1 = ' ' THEN NULL
      ELSE col1
    END col1
    

    另外,需要注意的一点是您的 LTRIM 和 RTRIM 将值从空格 (' ') 减少到空白 ('')。如果需要去掉空格,那么case语句要适当修改:

    CASE
      WHEN LTRIM(RTRIM(col1)) = '' THEN NULL
      ELSE LTRIM(RTRIM(col1))
    END col1
    

    【讨论】:

      【解决方案6】:

      也许是这样的?

      UPDATE [MyTable]
      SET [SomeField] = NULL
      WHERE [SomeField] is not NULL
      AND LEN(LTRIM(RTRIM([SomeField]))) = 0
      

      【讨论】:

        【解决方案7】:

        这是一个给你的正则表达式。

        update table
        set col1=null
        where col1 not like '%[a-z,0-9]%'
        

        基本上找到其中没有字母或数字的任何列并将其设置为空。如果您的列仅包含特殊字符,则可能需要更新。

        【讨论】:

        • 我想你已经回答了你自己的问题,为什么这是一个坏主意。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-23
        • 1970-01-01
        • 2018-06-12
        • 1970-01-01
        • 1970-01-01
        • 2011-05-10
        • 1970-01-01
        相关资源
        最近更新 更多