【发布时间】:2011-04-11 17:40:49
【问题描述】:
我有一个表,该表上的列包含一些记录的空格。现在我需要将数据移动到另一个表并用NULL 值替换空格。
我尝试使用:
REPLACE(ltrim(rtrim(col1)),' ',NULL)
但它不起作用。它会将col1 的所有值转换为NULL。我只想将那些有空格的值转换为NULL。
【问题讨论】:
标签: sql-server null is-empty
我有一个表,该表上的列包含一些记录的空格。现在我需要将数据移动到另一个表并用NULL 值替换空格。
我尝试使用:
REPLACE(ltrim(rtrim(col1)),' ',NULL)
但它不起作用。它会将col1 的所有值转换为NULL。我只想将那些有空格的值转换为NULL。
【问题讨论】:
标签: sql-server null is-empty
我使用NULLIF函数解决了类似的问题:
UPDATE table
SET col1 = NULLIF(col1, '')
NULLIF 如果两个表达式不相等,则返回第一个表达式。如果表达式相等,NULLIF 返回第一个表达式类型的空值。
【讨论】:
INSERT 语句中使用它,这是一个不错的选择
你试过了吗?
UPDATE table
SET col1 = NULL
WHERE col1 = ''
正如评论者指出的那样,您不必执行ltrim() 或rtrim(),并且NULL 列将不匹配''。
【讨论】:
NULL,因为这样程序逻辑就必须注意它们。
SQL Server 在比较字符串时忽略尾随空格,因此 ' ' = ''。只需使用以下查询进行更新
UPDATE table
SET col1 = NULL
WHERE col1 = ''
您的表中的 NULL 值将保持为 NULL,并且带有任何数字的仅空格字符的 col1s 将更改为 NULL。
如果您想在从一个表复制到另一个表期间执行此操作,请使用以下命令:
INSERT INTO newtable ( col1, othercolumn )
SELECT
NULLIF(col1, ''),
othercolumn
FROM table
【讨论】:
这段代码生成了一些 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'
【讨论】:
从源表中选择时,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 [MyTable]
SET [SomeField] = NULL
WHERE [SomeField] is not NULL
AND LEN(LTRIM(RTRIM([SomeField]))) = 0
【讨论】:
这是一个给你的正则表达式。
update table
set col1=null
where col1 not like '%[a-z,0-9]%'
基本上找到其中没有字母或数字的任何列并将其设置为空。如果您的列仅包含特殊字符,则可能需要更新。
【讨论】: