SQL - 如何从字符串中删除 space 字符

SQL - How to remove a space character from a string

我有一个 table,其中列 (varchar) 的最大长度为 12,有人用 space 加载了一些值,所以 'SPACE' 不是 'SPACE '

我想使用脚本删除 space,我确定 RTRIM 或 REPLACE(myValue, ' ', '') 会起作用,但 LEN(myValue) 显示仍然有额外的字符?

很可能是其他一些非打印字符,从 *nix 和其他 OS 之间移动时 return 是一个很大的字符。一种判断方法是使用 DUMP 函数。所以你可以从这样的查询开始:

SELECT dump(column_name)
FROM your_table
WHERE column_name LIKE 'SPACE%'

这应该可以帮助您找到有问题的角色,但是,这并不能解决您的问题。相反,我会使用 REGEXP_REPLACE:

SELECT REGEXP_REPLACE(column_name, '[^A-z]')
FROM your_table

这应该会处理任何非打印字符。如果您希望字符串中包含数字或符号,则可能需要使用正则表达式。您可以切换到字符 class,例如:

SELECT REGEXP_REPLACE(column_name, '[:cntrl:]')
FROM your_table

正如一些人所说,它可能不是 space。获取 ngrams8k 的副本,然后使用它来确定问题。例如,这里我们有文本“SPACE”,前面有 space 和结尾的 CHAR(160)(HTML BR 标记)。 CHAR(160) 在 SSMS 中看起来像 space,但不是 "trimable"。例如考虑这个查询:

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;

Returns:

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),即 space。最后一个字符(第 7 位)不是 space。 知道 CHAR(160) 是问题所在,您可以这样解决它:

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

如果您使用的是 SQL Server 2017+,您还可以使用 TRIM,它的功能远不止 LTRIM 和 RTRIM。例如,这将删除 前导和尾随制表符、spaces、回车符 returns、行 returns 和 HTML BR 标记。

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