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

nic*_*App 43 sql-server null is-empty

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

我试着用:

REPLACE(ltrim(rtrim(col1)),' ',NULL)
Run Code Online (Sandbox Code Playgroud)

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

gec*_*eca 103

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

UPDATE table 
SET col1 = NULLIF(col1, '')
Run Code Online (Sandbox Code Playgroud)

从T-SQL参考:

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

  • 这样做的主要缺点是表中的所有行都将被更新,而不仅仅是需要更改的行. (3认同)

egr*_*nin 42

你试过这个吗?

UPDATE table 
SET col1 = NULL 
WHERE col1 = ''
Run Code Online (Sandbox Code Playgroud)

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

  • 您甚至不需要使用RTRIM.SQL Server在比较字符串时忽略尾随空格. (6认同)

Ben*_*thy 24

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

UPDATE table
SET col1 = NULL
WHERE col1 = ''
Run Code Online (Sandbox Code Playgroud)

表中的NULL值将保持为NULL,并且只有空格字符的任何数字的col1将更改为NULL.

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

INSERT INTO newtable ( col1, othercolumn )
SELECT
   NULLIF(col1, ''),
   othercolumn
FROM table
Run Code Online (Sandbox Code Playgroud)

  • IMO这是最好的答案。问题询问如何在复制过程中将空字符串转换为 null。接受的答案不好,因为它分两步完成,这不仅效率较低,而且阻止 DBA 添加约束以确保不存在空字符串。 (2认同)

gls*_*123 13

此代码生成一些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'
Run Code Online (Sandbox Code Playgroud)


小智 10

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

CASE
  WHEN col1 = ' ' THEN NULL
  ELSE col1
END col1
Run Code Online (Sandbox Code Playgroud)

此外,需要注意的一点是,您的LTRIM和RTRIM会将值从空格('')减少为空白('').如果需要删除空格,则应适当修改case语句:

CASE
  WHEN LTRIM(RTRIM(col1)) = '' THEN NULL
  ELSE LTRIM(RTRIM(col1))
END col1
Run Code Online (Sandbox Code Playgroud)


小智 7

也许是这样的?

UPDATE [MyTable]
SET [SomeField] = NULL
WHERE [SomeField] is not NULL
AND LEN(LTRIM(RTRIM([SomeField]))) = 0
Run Code Online (Sandbox Code Playgroud)