如何使用SQL Server将空格转换为空值?
我有一个表,该表上的列包含一些记录的空白空间。现在我需要将数据移动到另一个表,并用NULL
值替换空的空格。如何使用SQL Server将空格转换为空值?
我试着使用:
REPLACE(ltrim(rtrim(col1)),' ',NULL)
,但它不工作。它会将所有col1
的值转换为NULL
。我只想将那些只有空格的值转换为NULL
。
你试过这个吗?
UPDATE table
SET col1 = NULL
WHERE col1 = ''
正如评论者指出的那样,你不必做ltrim()
或rtrim()
,并NULL
列将不匹配''
。
也许这样?
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]%'
本质上找到任何不包含字母或数字的列,并将其设置为空。可能必须更新,如果你有只有特殊字符的列。
我想你已经回答了你自己的问题,为什么这是一个坏主意。 – 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
我解决了使用NULLIF
功能类似的问题:
UPDATE table
SET col1 = NULLIF(col1, '')
如果两个表达式不相等,则NULLIF返回第一个表达式。如果表达式相等,则NULLIF返回第一个表达式类型的空值。
此代码生成一些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'
你甚至都不需要使用RTRIM。比较字符串时,SQL Server会忽略尾随空格。 – 2010-09-20 00:47:12
@Bennor McCarthy:哇,我真的滑倒了...现在放下这个条款 – egrunin 2010-09-20 03:04:27
不是一个真正的主要问题。这不像性能或使用索引是真正关注的查询。无论如何,你的回答仍然正确。 :) – 2010-09-20 03:18:54