如何使用SQL Server将空格转换为空值?

问题描述:

我有一个表,该表上的列包含一些记录的空白空间。现在我需要将数据移动到另一个表,并用NULL值替换空的空格。如何使用SQL Server将空格转换为空值?

我试着使用:

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

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

你试过这个吗?

UPDATE table 
SET col1 = NULL 
WHERE col1 = '' 

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

+4

你甚至都不需要使用RTRIM。比较字符串时,SQL Server会忽略尾随空格。 – 2010-09-20 00:47:12

+0

@Bennor McCarthy:哇,我真的滑倒了...现在放下这个条款 – egrunin 2010-09-20 03:04:27

+0

不是一个真正的主要问题。这不像性能或使用索引是真正关注的查询。无论如何,你的回答仍然正确。 :) – 2010-09-20 03:18:54

也许这样?

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

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 

这里有一个正则表达式一个雅。

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

本质上找到任何不包含字母或数字的列,并将其设置为空。可能必须更新,如果你有只有特殊字符的列。

+2

我想你已经回答了你自己的问题,为什么这是一个坏主意。 – MikeKulls 2012-07-06 03:19:56

SQL Server在比较字符串时忽略尾随空格,所以''=''。只需使用下面的查询为您更新

UPDATE table 
SET col1 = NULL 
WHERE col1 = '' 

NULL值在表中会留下空,并在空间与任意数量的col1s只有字符将被更改为NULL。

如果你想从一个表的副本到另一个过程中做到这一点,使用:

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

IMO这是最好的答案。这个问题问到如何在复制过程中将空字符串转换为空值。接受的答案不好,因为它在2个步骤中执行,这不仅效率低下,而且阻止DBA添加约束以确保没有空字符串。 – MikeKulls 2012-07-06 03:24:09

+0

我同意这里的第二个查询确实是最符合问题的答案,尽管我的答案是可以接受的答案。 – egrunin 2014-07-29 09:06:19

我解决了使用NULLIF功能类似的问题:

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

From the T-SQL reference:

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

+0

http://technet.microsoft.com/en-us/library/ms177562.aspx – 2014-05-12 06:15:09

+3

这样做的主要缺点是表中的所有行都将被更新,而不仅仅是需要更改的行。 – Trisped 2014-12-05 22:58:59

+1

@Trisped:当然,但对于那些希望在'INSERT'语句中执行类似操作的人来说,这是一个很好的选择。 – Ellesedil 2015-02-19 19:19:08

此代码生成一些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' 
+1

你的脚本很棒,你也可以加上: 'WHERE ['+ COLUMN_NAME +']'+'NOT LIKE'+'''%[az,0-9]%'''' – GeorgesC 2015-05-29 17:51:37

+0

谢谢,那是什么正则表达式呢? – gls123 2015-08-17 09:03:21