我需要确保给定字段在字符之间没有多个空格(我不关心所有空格,只关心空格)。
所以
'single spaces only'
需要变成
'single spaces only'
以下不起作用
select replace('single spaces only',' ',' ')
因为它会导致
'single spaces only'
我更愿意坚持使用原生T-SQL而不是基于CLR的解决方案。
思想?
答案 0 :(得分:280)
更整洁:
select string = replace(replace(replace(' select single spaces',' ','<>'),'><',''),'<>',' ')
输出:
选择单个空格
答案 1 :(得分:21)
这样可行:
declare @test varchar(100)
set @test = 'this is a test'
while charindex(' ',@test ) > 0
begin
set @test = replace(@test, ' ', ' ')
end
select @test
答案 2 :(得分:12)
如果您知道连续的空格不会超过一定数量,您可以嵌套替换:
replace(replace(replace(replace(myText,' ',' '),' ',' '),' ',' '),' ',' ')
4次替换应该最多可以修复16个连续的空格(16个,然后是8个,然后是4个,然后是2个,然后是1个)
如果它可能显着更长,那么你必须做一些类似于内联函数的事情:
CREATE FUNCTION strip_spaces(@str varchar(8000))
RETURNS varchar(8000) AS
BEGIN
WHILE CHARINDEX(' ', @str) > 0
SET @str = REPLACE(@str, ' ', ' ')
RETURN @str
END
然后就这样做
SELECT dbo.strip_spaces(myText) FROM myTable
答案 3 :(得分:6)
update mytable
set myfield = replace (myfield, ' ', ' ')
where charindex(' ', myfield) > 0
替换将适用于所有双倍空格,无需多次替换。这是基于集合的解决方案。
答案 4 :(得分:5)
这有点蛮力,但会起作用
CREATE FUNCTION stripDoubleSpaces(@prmSource varchar(max)) Returns varchar(max)
AS
BEGIN
WHILE (PATINDEX('% %', @prmSource)>0)
BEGIN
SET @prmSource = replace(@prmSource ,' ',' ')
END
RETURN @prmSource
END
GO
-- Unit test --
PRINT dbo.stripDoubleSpaces('single spaces only')
single spaces only
答案 5 :(得分:4)
可以通过函数递归完成:
CREATE FUNCTION dbo.RemSpaceFromStr(@str VARCHAR(MAX)) RETURNS VARCHAR(MAX) AS
BEGIN
RETURN (CASE WHEN CHARINDEX(' ', @str) > 0 THEN
dbo.RemSpaceFromStr(REPLACE(@str, ' ', ' ')) ELSE @str END);
END
然后,例如:
SELECT dbo.RemSpaceFromStr('some string with many spaces') AS NewStr
返回:
NewStr
some string with many spaces
或者基于@ agdk26或@Neil Knight描述的方法的解决方案(但更安全)
两个例子都返回上面的输出:
SELECT REPLACE(REPLACE(REPLACE('some string with many spaces'
, ' ', ' ' + CHAR(7)), CHAR(7) + ' ', ''), ' ' + CHAR(7), ' ') AS NewStr
--but it remove CHAR(7) (Bell) from string if exists...
或
SELECT REPLACE(REPLACE(REPLACE('some string with many spaces'
, ' ', ' ' + CHAR(7) + CHAR(7)), CHAR(7) + CHAR(7) + ' ', ''), ' ' + CHAR(7) + CHAR(7), ' ') AS NewStr
--but it remove CHAR(7) + CHAR(7) from string
<强>注意:强>
用于替换空格的字符/字符串不应该存在于字符串的开头或结尾,而是独立存在。
答案 6 :(得分:2)
这是我创建的一个简单函数,用于清除之前或之后的任何空格,以及字符串中的多个空格。它可以在一个拉伸中优雅地处理多达108个空格,并且在字符串中可以处理多个块。如果需要,可以通过添加具有更大空间块的其他行来增加8倍。尽管它在大型应用程序中的普遍使用,它似乎可以快速执行并且没有引起任何问题。
Text' of type
答案 7 :(得分:1)
在寻找答案时找到了这个:
SELECT REPLACE(
REPLACE(
REPLACE(
LTRIM(RTRIM('1 2 3 4 5 6'))
,' ',' '+CHAR(7))
,CHAR(7)+' ','')
,CHAR(7),'') AS CleanString
where charindex(' ', '1 2 3 4 5 6') > 0
完整答案(附带解释)来自:http://techtipsbysatish.blogspot.com/2010/08/sql-server-replace-multiple-spaces-with.html
第二眼看,似乎只是所选答案的略有不同版本。
答案 8 :(得分:1)
这是通过多次替换的解决方案,适用于任何字符串(不需要特殊字符,不属于字符串)。
declare @value varchar(max)
declare @result varchar(max)
set @value = 'alpha beta gamma delta xyz'
set @result = replace(replace(replace(replace(replace(replace(replace(
@value,'a','ac'),'x','ab'),' ',' x'),'x ',''),'x',''),'ab','x'),'ac','a')
select @result -- 'alpha beta gamma delta xyz'
答案 9 :(得分:0)
方法#1
第一种方法是用不常见的符号组合替换单词之间的额外空格作为临时标记。然后,您可以使用替换函数而不是循环来替换临时标记符号。
这是一个替换String变量中文本的代码示例。
DECLARE @testString AS VARCHAR(256) = ' Test text with random* spacing. Please normalize this spacing!';
SELECT REPLACE(REPLACE(REPLACE(@testString, ' ', '*^'), '^*', ''), '*^', ' ');
执行时间测试#1:在此替换方法的十次运行中,服务器回复的平均等待时间为1.7毫秒,总执行时间为4.6毫秒。 执行时间测试#2:服务器回复的平均等待时间为1.7毫秒,总执行时间为3.7毫秒。
方法#2
第二种方法不如第一种方法那么优雅,但也可以完成工作。此方法通过嵌套四个(或可选更多)替换语句来替换两个空格和一个空格。
DECLARE @testString AS VARCHAR(256) = ' Test text with random* spacing. Please normalize this spacing!';
SELECT REPLACE(REPLACE(REPLACE(REPLACE(@testString,' ',' '),' ',' '),' ',' '),' ',' ')
执行时间测试#1:在此替换方法的十次运行中,服务器回复的平均等待时间为1.9毫秒,总执行时间为3.8毫秒。 执行时间测试#2:服务器回复的平均等待时间为1.8毫秒,总执行时间为4.8毫秒。
方法#3
替换单词之间的额外空格的第三种方法是使用简单的循环。您可以在while循环中检查额外的空格,然后使用replace函数在循环的每次迭代中减少额外的空格。
DECLARE @testString AS VARCHAR(256) = ' Test text with random* spacing. Please normalize this spacing!';
WHILE CHARINDEX(' ',@testString) > 0
SET @testString = REPLACE(@testString, ' ', ' ')
SELECT @testString
执行时间测试#1:在此替换方法的十次运行中,服务器回复的平均等待时间为1.8毫秒,总执行时间为3.4毫秒。 执行时间测试#2:服务器回复的平均等待时间为1.9毫秒,总执行时间为2.8毫秒。
答案 10 :(得分:0)
我对replace multiple spaces into single space使用FOR XML PATH解决方案
这个想法是用XML标签代替空格 然后将XML字符串拆分为没有XML标签的字符串片段 最后,通过在两个字符串之间添加单个空格字符来串联这些字符串值。
以下是最终UDF函数的调用方式
select dbo.ReplaceMultipleSpaces(' Sample text with multiple space ')
答案 11 :(得分:0)
DECLARE @str varchar(150)
SET @str='Hello My name is Jiyaul mustafa'
Select REPLACE(REPLACE(REPLACE(@str,' ','{}'),'}{',''),'{}',' ')
答案 12 :(得分:0)
我通常使用这种方法:
declare @s varchar(50)
set @s = 'TEST TEST'
select REPLACE(REPLACE(REPLACE(@s,' ','[o][c]'),'[c][o]',''),'[o][c]',' ')
答案 13 :(得分:0)
只需添加另一种方法-
在SQL Server中不使用REPLACE而不用单个空间替换多个空间-
DECLARE @TestTable AS TABLE(input VARCHAR(MAX));
INSERT INTO @TestTable VALUES
('HAPPY NEWYEAR 2020'),
('WELCOME ALL !');
SELECT
CAST('<r><![CDATA[' + input + ']]></r>' AS XML).value('(/r/text())[1] cast as xs:token?','VARCHAR(MAX)')
AS Expected_Result
FROM @TestTable;
--OUTPUT
/*
Expected_Result
HAPPY NEWYEAR 2020
WELCOME ALL !
*/
答案 14 :(得分:0)
请在下面找到代码
select trim(string_agg(value,' ')) from STRING_SPLIT(' single spaces only ',' ')
where value<>' '
这对我有用。 希望这会有所帮助...
答案 15 :(得分:-2)
update mytable
set myfield = replace(myfield, ' ', ' ')
where myfield like '% %'
试试这个..
答案 16 :(得分:-3)
你可以试试这个:
select Regexp_Replace('single spaces only','( ){2,}', ' ') from dual;