首页 > 解决方案 > SQL - 如何从字符串中删除空格字符

问题描述

我有一个表,其中列(varchar)的最大长度为 12,有人用空格加载了一些值,所以不是“SPACE”而是“SPACE”

我想使用脚本删除空格,我很肯定 RTRIM 或 REPLACE(myValue, ' ', '') 会起作用,但 LEN(myValue) 显示还有额外的字符?

标签: sqlsql-serverreplacewhitespacetrim

解决方案


正如几个人所提到的,它可能不是一个空间。获取 ngrams8k的副本,然后使用它来识别问题。例如,这里有文本“SPACE”,前面有空格,后面有 CHAR(160)(HTML BR 标记)。CHAR(160) 看起来像 SSMS 中的空格,但不是“可修剪的”。例如考虑这个查询:

DECLARE @string VARCHAR(100) = ' SPACE'+CHAR(160);
SELECT '"'+@string+'"'

使用ngrams8k你可以这样做:

DECLARE @string VARCHAR(100) = ' SPACE'+CHAR(160);

SELECT
  ng.position,
  ng.token,
  asciival = ASCII(ng.token)
FROM   dbo.ngrams8k(@string,1) AS ng;

回报:

position   token   asciival
---------- ------- -----------
1                  32
2          S       83
3          P       80
4          A       65
5          C       67
6          E       69
7                  160

如您所见,第一个字符(位置 1)是 CHAR(32),这是一个空格。最后一个字符(第 7 位)不是空格。知道 CHAR(160) 是问题,您可以像这样修复它:

SET @string = REPLACE(LTRIM(@string),CHAR(160),'')

如果您使用的是 SQL Server 2017+,您还可以使用TRIMwhich 不仅仅是 LTRIM-and-RTRIM-ing。例如,这将删除前导和尾随制表符、空格、回车、换行和 HTML BR 标记。

SET @string = SELECT TRIM(CHAR(32)+CHAR(9)+CHAR(10)+CHAR(13)+CHAR(160) FROM @string)

推荐阅读