我有一个表格,其中某些记录的列包含空格。现在,我需要将数据移动到另一个表格,并用NULL
值替换空格。
我尝试使用:
REPLACE(ltrim(rtrim(col1)),' ',NULL)
但它无效。 它将把col1
的所有值转换为NULL
。 我只想将那些空格为空的值转换为NULL
。
我有一个表格,其中某些记录的列包含空格。现在,我需要将数据移动到另一个表格,并用NULL
值替换空格。
我尝试使用:
REPLACE(ltrim(rtrim(col1)),' ',NULL)
但它无效。 它将把col1
的所有值转换为NULL
。 我只想将那些空格为空的值转换为NULL
。
我用NULLIF
函数解决了一个类似的问题:
UPDATE table
SET col1 = NULLIF(col1, '')
如果两个表达式不相等,则NULLIF返回第一个表达式。 如果表达式相等,则NULLIF返回第一个表达式的类型为空值。
你试过这个吗?
UPDATE table
SET col1 = NULL
WHERE col1 = ''
正如评论者指出的那样,你不必使用ltrim()
或rtrim()
函数,并且NULL
列将不会匹配''
。
NULL
,因为程序逻辑必须注意它们。 - egruninSQL Server在比较字符串时会忽略末尾的空格,所以' ' = ''。只需使用以下查询来更新即可:
UPDATE table
SET col1 = NULL
WHERE col1 = ''
你的表中的NULL值将保持不变,而仅由数字或空格组成的col1s将被更改为NULL。
如果您想在从一张表复制到另一张表的过程中执行此操作,请使用以下代码:
INSERT INTO newtable ( col1, othercolumn )
SELECT
NULLIF(col1, ''),
othercolumn
FROM table
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'
WHERE [' + COLUMN_NAME + '] ' + 'NOT LIKE ' + '''%[a-z,0-9]%'''
- GeorgesC使用 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]%'
本质上查找任何不含字母或数字的列,并将其设置为null。如果您的列仅包含特殊字符,则可能需要进行更新。
INSERT
语句中使用它,则此选项是一个不错的选择。 - tim