从 SQL Server 中的字符串中删除所有空格
Posted
技术标签:
【中文标题】从 SQL Server 中的字符串中删除所有空格【英文标题】:Remove all spaces from a string in SQL Server 【发布时间】:2012-05-13 00:14:06 【问题描述】:在 SQL Server 2008 中从字符串中删除所有空格的最佳方法是什么?
LTRIM(RTRIM(' a b '))
将删除字符串左右两侧的所有空格,但我还需要删除中间的空格。
【问题讨论】:
“所有空格”是指只有常规空格吗?或者,您是指制表符、CR、LF 和其他可能显示为空格的字符吗? @GordonLinoff :我的意思是常规空格 【参考方案1】:只需替换它;
SELECT REPLACE(fld_or_variable, ' ', '')
编辑:
只是为了澄清;它是全局替换,无需trim()
或担心char
或varchar
的多个空格:
create table #t (
c char(8),
v varchar(8))
insert #t (c, v) values
('a a' , 'a a' ),
('a a ' , 'a a ' ),
(' a a' , ' a a' ),
(' a a ', ' a a ')
select
'"' + c + '"' [IN], '"' + replace(c, ' ', '') + '"' [OUT]
from #t
union all select
'"' + v + '"', '"' + replace(v, ' ', '') + '"'
from #t
结果
IN OUT
===================
"a a " "aa"
"a a " "aa"
" a a " "aa"
" a a " "aa"
"a a" "aa"
"a a " "aa"
" a a" "aa"
" a a " "aa"
【讨论】:
单词之间有多个空格怎么办? REPLACE 一次只删除一个。应该编写一个用户定义的函数来删除多个空格。 这似乎不能替换尾随空格 它应该替换所有的空格 它将删除除尾随之外的所有空格。要删除尾随添加 TRIM(REPLACE(fld_or_variable, ' ', ''))。它甚至删除多个空格的原因是因为......它会将每个空格字符更改为无,无论空格是否彼此相邻。 替换删除所有空格,甚至尾随一个空格。如果完成此操作后数据中仍有明显的空格,则很可能它们不是空格,而是制表符或回车等不可打印的字符。【参考方案2】:我会使用替换
select REPLACE (' Hello , How Are You ?', ' ', '' )
REPLACE
【讨论】:
【参考方案3】:t-sql 替换http://msdn.microsoft.com/en-us/library/ms186862.aspx
替换(val, ' ', '')
【讨论】:
【参考方案4】:REPLACE()
function:
REPLACE(field, ' ', '')
【讨论】:
【参考方案5】:如果字符串中有多个空格,则替换可能无法正常工作。为此,应使用以下函数。
CREATE FUNCTION RemoveAllSpaces
(
@InputStr varchar(8000)
)
RETURNS varchar(8000)
AS
BEGIN
declare @ResultStr varchar(8000)
set @ResultStr = @InputStr
while charindex(' ', @ResultStr) > 0
set @ResultStr = replace(@InputStr, ' ', '')
return @ResultStr
END
例子:
select dbo.RemoveAllSpaces('aa aaa aa aa a')
输出:
aaaaaaaaaa
【讨论】:
"@InputStr" 应该是 while 循环体中的 "@ResultStr"。 @jjoelson 你介意创建这个函数并在指出错误之前对其进行测试吗? 对不起,我在您的上述假设下工作,即 REPLACE 一次只删除一个,在这种情况下,此函数会导致具有多个空格的输入出现无限循环。实际上,甚至根本不需要 while 循环。 Farhan,如果 REPLACE 以您认为的方式工作,那么@jjoelson 的第一条评论是正确的。否则你将有一个无限循环,因为 InputStr 永远不会改变,所以 ResultStr 将永远是第一个 REPLACE 结果。您的代码有效的原因是因为 REPLACE 只需要 1 次。无论您向它扔什么字符串,它都不会被第二次调用。添加一个计数器并在每次迭代时打印出来。它将始终为 1。REPLACE(InputStr, ' ', '') 将通过一次调用删除每个空格。【参考方案6】:如果是对表的更新,您只需多次运行此更新,直到它影响 0 行。
update tableName
set colName = REPLACE(LTRIM(RTRIM(colName)), ' ', ' ')
where colName like '% %'
【讨论】:
【参考方案7】:以防万一您需要修剪所有列中的空格,您可以使用此脚本动态执行此操作:
--Just change table name
declare @MyTable varchar(100)
set @MyTable = 'MyTable'
--temp table to get column names and a row id
select column_name, ROW_NUMBER() OVER(ORDER BY column_name) as id into #tempcols from INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE IN ('varchar', 'nvarchar') and TABLE_NAME = @MyTable
declare @tri int
select @tri = count(*) from #tempcols
declare @i int
select @i = 0
declare @trimmer nvarchar(max)
declare @comma varchar(1)
set @comma = ', '
--Build Update query
select @trimmer = 'UPDATE [dbo].[' + @MyTable + '] SET '
WHILE @i <= @tri
BEGIN
IF (@i = @tri)
BEGIN
set @comma = ''
END
SELECT @trimmer = @trimmer + CHAR(10)+ '[' + COLUMN_NAME + '] = LTRIM(RTRIM([' + COLUMN_NAME + ']))'+@comma
FROM #tempcols
where id = @i
select @i = @i+1
END
--execute the entire query
EXEC sp_executesql @trimmer
drop table #tempcols
【讨论】:
【参考方案8】:如果您想从字符串中删除空格、- 和其他文本,请使用以下内容:
假设您的表格中有一个手机号码,例如“718-378-4957”或 ' 7183784957' 并且您想要替换并获取手机号码,然后使用以下文本。
select replace(replace(replace(replace(MobileNo,'-',''),'(',''),')',''),' ','') from EmployeeContactNumber
结果:-- 7183784957
【讨论】:
【参考方案9】:删除字符串左右的空格。要删除中间的空间,请使用Replace
。
您可以使用RTRIM()
删除右侧的空格,使用LTRIM()
删除左侧的空格,从而删除左右空格,如下所示:
SELECT * FROM table WHERE LTRIM(RTRIM(username)) = LTRIM(RTRIM("Bob alias baby"))
【讨论】:
【参考方案10】:Reference taken from this blog:
首先,创建示例表和数据:
CREATE TABLE tbl_RemoveExtraSpaces
(
Rno INT
,Name VARCHAR(100)
)
GO
INSERT INTO tbl_RemoveExtraSpaces VALUES (1,'I am Anvesh Patel')
INSERT INTO tbl_RemoveExtraSpaces VALUES (2,'Database Research and Development ')
INSERT INTO tbl_RemoveExtraSpaces VALUES (3,'Database Administrator ')
INSERT INTO tbl_RemoveExtraSpaces VALUES (4,'Learning BIGDATA and NOSQL ')
GO
选择不带额外空格的字符串的脚本:
SELECT
[Rno]
,[Name] AS StringWithSpace
,LTRIM(RTRIM(REPLACE(REPLACE(REPLACE([Name],CHAR(32),'()'),')(',''),'()',CHAR(32)))) AS StringWithoutSpace
FROM tbl_RemoveExtraSpaces
结果:
Rno StringWithSpace StringWithoutSpace
----------- ----------------------------------------- ---------------------------------------------
1 I am Anvesh Patel I am Anvesh Patel
2 Database Research and Development Database Research and Development
3 Database Administrator Database Administrator
4 Learning BIGDATA and NOSQL Learning BIGDATA and NOSQL
【讨论】:
您是否意识到 OP 想要删除所有空格而不是用一个替换多个空格? 这应该被否决,因为答案不是 OP 所要求的,而是得到了 4 个赞成票。欢迎使用 Stack Overflow。 @Mr.J 现在有 9 个。疯狂的世界。【参考方案11】:我今天遇到了这个问题,replace / trim 成功了..见下文。
update table_foo
set column_bar = REPLACE(LTRIM(RTRIM(column_bar)), ' ', '')
之前和之后:
old-bad: column_bar | New-fixed: column_bar
' xyz ' | 'xyz'
' xyz ' | 'xyz'
' xyz ' | 'xyz'
' xyz ' | 'xyz'
' xyz ' | 'xyz'
' xyz ' | 'xyz'
【讨论】:
【参考方案12】:100% 正常工作
UPDATE table_name SET "column_name"=replace("column_name", ' ', ''); //Remove white space
UPDATE table_name SET "column_name"=replace("column_name", '\n', ''); //Remove newline
UPDATE table_name SET "column_name"=replace("column_name", '\t', ''); //Remove all tab
您可以使用"column_name"
或column_name
谢谢
副歌
【讨论】:
我不得不使用select replace(replace(replace(varcharColumn,char(13),''),char(10),''),' ','')
来删除varchar
列中的所有换行符和空格。如果我使用 '\n' 和 '\r' 而不是 char(13) 和 char(10) 则不起作用。
要执行此操作,需要运行“SET SQL_SAFE_UPDATES = 0;”
这正是我所需要的!谢谢!!【参考方案13】:
提示一下,如果您在使用替换功能时遇到问题,您可能会将数据类型设置为 nchar(在这种情况下,它是固定长度并且不起作用)。
【讨论】:
【参考方案14】:这可以消除字符串上的空格:
UPDATE
tablename
SET
columnname = replace(columnname, ' ', '');
【讨论】:
【参考方案15】:为了使以上所有答案都完整,*** 上有关于如何处理所有空白字符的附加帖子(有关这些字符的完整列表,请参阅 https://en.wikipedia.org/wiki/Whitespace_character):
TSQL 2008 Using LTrim(RTrim and still have spaces in the data How do I remove non-breaking spaces from a column in SQL server? What's a good way to trim all whitespace characters from a string in T-SQL without UDF and without CLR?【讨论】:
【参考方案16】:replace(replace(column_Name,CHAR(13),''),CHAR(10),'')
【讨论】:
【参考方案17】:这对我很有用:
CREATE FUNCTION dbo.TRIM(@String VARCHAR(MAX))
RETURNS VARCHAR(MAX)
BEGIN
RETURN LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@String,CHAR(10),'[]'),CHAR(13),'[]'),char(9),'[]'),CHAR(32),'[]'),'][',''),'[]',CHAR(32))));
END
GO
.
【讨论】:
【参考方案18】:替换特定字符的语法:
REPLACE ( string_expression , string_pattern , string_replacement )
例如在字符串“HelloReplaceThingsGoing”中替换词被How替换
SELECT REPLACE('HelloReplaceThingsGoing','Replace','How');
GO
【讨论】:
【参考方案19】:删除空格、cr、lf、制表符或可配置的功能版本 (udf)。
select Common.ufn_RemoveWhitespace(' 234 asdf wefwef 3 x ', default) as S
结果:'234asdfwefwef3x'
alter function Common.RemoveWhitespace
(
@pString nvarchar(max),
@pWhitespaceCharsOpt nvarchar(max) = null -- default: tab, lf, cr, space
)
returns nvarchar(max) as
/*--------------------------------------------------------------------------------------------------
Purpose: Compress whitespace
Example: select Common.ufn_RemoveWhitespace(' 234 asdf wefwef 3 x ', default) as s
-- Result: 234asdfwefwef3x
Modified By Description
---------- ----------- --------------------------------------------------------------------
2018.07.24 crokusek Initial Version
--------------------------------------------------------------------------------------------------*/
begin
declare
@maxLen bigint = 1073741823, -- (2^31 - 1) / 2 (https://***.com/a/4270085/538763)
@whitespaceChars nvarchar(30) = coalesce(
@pWhitespaceCharsOpt,
char(9) + char(10) + char(13) + char(32)); -- tab, lf, cr, space
declare
@whitespacePattern nvarchar(30) = '%[' + @whitespaceChars + ']%',
@nonWhitespacePattern nvarchar(30) = '%[^' + @whitespaceChars + ']%',
@previousString nvarchar(max) = '';
while (@pString != @previousString)
begin
set @previousString = @pString;
declare
@whiteIndex int = patindex(@whitespacePattern, @pString);
if (@whiteIndex > 0)
begin
declare
@whitespaceLength int = nullif(patindex(@nonWhitespacePattern, substring(@pString, @whiteIndex, @maxLen)), 0) - 1;
set @pString =
substring(@pString, 1, @whiteIndex - 1) +
iif(@whiteSpaceLength > 0, substring(@pString, @whiteIndex + @whiteSpaceLength, @maxLen), '');
end
end
return @pString;
end
go
【讨论】:
【参考方案20】:由于某种原因,每次替换只能处理一个字符串。 我有一个类似“Test MSP”这样的字符串,我只想留一个空格。
我使用了@Farhan 所做的方法,但做了一些修改:
CREATE FUNCTION ReplaceAll
(
@OriginalString varchar(8000),
@StringToRemove varchar(20),
@StringToPutInPlace varchar(20)
)
RETURNS varchar(8000)
AS
BEGIN
declare @ResultStr varchar(8000)
set @ResultStr = @OriginalString
while charindex(@StringToRemove, @ResultStr) > 0
set @ResultStr = replace(@ResultStr, @StringToRemove, @StringToPutInPlace)
return @ResultStr
END
然后我像这样运行我的更新
UPDATE tbTest SET Description = dbo.ReplaceAll(Description, ' ', ' ') WHERE ID = 14225
然后我得到了这个结果: 测试 MSP
如果有人像我一样需要它,请在此处发布。
运行时间: 微软 SQL Server 2016 (SP2)
【讨论】:
【参考方案21】:似乎每个人都在提到一个单一的 REPLACE 函数。甚至多次调用 REPLACE 函数。但是当你有未知数量的空格的动态输出时,它就不起作用了。任何经常处理这个问题的人都知道,REPLACE 只会删除一个空格,而不是全部,因为它应该这样做。 LTRIM 和 RTRIM 似乎也有同样的问题。把它留给微软。 这是一个使用 WHILE 循环删除 ALL CHAR(32) 值(空格)的示例输出。
DECLARE @INPUT_VAL VARCHAR(8000)
DECLARE @OUTPUT_VAL VARCHAR(8000)
SET @INPUT_VAL = ' C A '
SET @OUTPUT_VAL = @INPUT_VAL
WHILE CHARINDEX(CHAR(32), @OUTPUT_VAL) > 0 BEGIN
SET @OUTPUT_VAL = REPLACE(@INPUT_VAL, CHAR(32), '')
END
PRINT 'START:' + @INPUT_VAL + ':END'
PRINT 'START:' + @OUTPUT_VAL + ':END'
这是上面代码的输出:
START: C A :END
START:CA:END
现在更进一步并在 UPDATE 或 SELECT 语句中使用它,将其更改为 udf。
CREATE FUNCTION udf_RemoveSpaces (@INPUT_VAL VARCHAR(8000))
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @OUTPUT_VAL VARCHAR(8000)
SET @OUTPUT_VAL = @INPUT_VAL
-- ITTERATE THROUGH STRING TO LOOK FOR THE ASCII VALUE OF SPACE (CHAR(32)) REPLACE IT WITH BLANK, NOT NULL
WHILE CHARINDEX(CHAR(32), @OUTPUT_VAL) > 0 BEGIN
SET @OUTPUT_VAL = REPLACE(@INPUT_VAL, CHAR(32), '')
END
RETURN @OUTPUT_VAL
END
然后在 SELECT 或 INSERT 语句中使用该函数:
UPDATE A
SET STATUS_REASON_CODE = WHATEVER.dbo.udf_RemoveSpaces(STATUS_REASON_CODE)
FROM WHATEVER..ACCT_INFO A
WHERE A.SOMEVALUE = @SOMEVALUE
INSERT INTO SOMETABLE
(STATUS_REASON_CODE)
SELECT WHATEVER.dbo.udf_RemoveSpaces(STATUS_REASON_CODE)
FROM WHATEVER..ACCT_INFO A
WHERE A.SOMEVALUE = @SOMEVALUE
【讨论】:
"REPLACE 只会删除一个空格。" ...真的?这个简单的演示建议不要:dbfiddle.uk/…。你有一个例子说明哪里行不通吗?【参考方案22】:检查并尝试以下脚本(单元测试)-
--Declaring
DECLARE @Tbl TABLE(col_1 VARCHAR(100));
--Test Samples
INSERT INTO @Tbl (col_1)
VALUES
(' EY y
Salem')
, (' EY P ort Chennai ')
, (' EY Old Park ')
, (' EY ')
, (' EY ')
,(''),(null),('d
f');
SELECT col_1 AS INPUT,
LTRIM(RTRIM(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(col_1,CHAR(10),' ')
,CHAR(11),' ')
,CHAR(12),' ')
,CHAR(13),' ')
,CHAR(14),' ')
,CHAR(160),' ')
,CHAR(13)+CHAR(10),' ')
,CHAR(9),' ')
,' ',CHAR(17)+CHAR(18))
,CHAR(18)+CHAR(17),'')
,CHAR(17)+CHAR(18),' ')
)) AS [OUTPUT]
FROM @Tbl;
【讨论】:
【参考方案23】:尝试这样使用,如果正常空格没有被 LTRM 或 RTRM 删除
LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(Column_data, CHAR(9), ''), CHAR(10), ''), CHAR(13), '')))
【讨论】:
【参考方案24】:我知道最初的问题是关于简单地替换 空格,但如果您需要替换所有空格,您可以使用 TRANSLATE 函数(自 Sql Server 2019 起)将给定的字符列表转换为更容易更换的东西。然后用 REPLACE 函数包装它。
这样可以节省重复调用:
DECLARE @Whitespace CHAR(4) = CHAR(0) + CHAR(9) + CHAR(13) + CHAR(10);
SELECT REPLACE(
TRANSLATE(' TEST ', @Whitespace, ' '),
' ', '');
【讨论】:
以上是关于从 SQL Server 中的字符串中删除所有空格的主要内容,如果未能解决你的问题,请参考以下文章