56

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

我尝试使用:

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

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

4

7 回答 7

138

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

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

从 T-SQL 参考:

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

于 2012-10-05T08:49:27.727 回答
54

你试过这个吗?

UPDATE table 
SET col1 = NULL 
WHERE col1 = ''

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

于 2010-09-13T15:26:49.740 回答
33

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

UPDATE table
SET col1 = NULL
WHERE col1 = ''

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

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

INSERT INTO newtable ( col1, othercolumn )
SELECT
   NULLIF(col1, ''),
   othercolumn
FROM table
于 2010-09-20T00:45:08.123 回答
16

此代码生成一些 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'
于 2014-03-19T15:53:54.837 回答
12

从源表中选择时,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
于 2010-09-13T15:30:07.143 回答
7

也许是这样的?

UPDATE [MyTable]
SET [SomeField] = NULL
WHERE [SomeField] is not NULL
AND LEN(LTRIM(RTRIM([SomeField]))) = 0
于 2010-09-13T15:26:22.100 回答
0

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

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

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

于 2010-09-13T15:57:25.083 回答