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)
我有一个 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)