用T-SQL中的单个空格replace重复的空格
我需要确保给定的字段在字符之间没有多于一个空格(我不关心所有的空格,只是空格)。
所以
'single spaces only'
需要变成
'single spaces only'
以下将无法正常工作
select replace('single spaces only',' ',' ')
因为它会导致
'single spaces only'
我真的宁愿坚持原生T-SQL而不是基于CLR的解决scheme。
思考?
更整洁:
select string = replace(replace(replace(' select single spaces',' ','<>'),'><',''),'<>',' ')
输出:
select单个空格
这将工作:
declare @test varchar(100) set @test = 'this is a test' while charindex(' ',@test ) > 0 begin set @test = replace(@test, ' ', ' ') end select @test
如果你知道连续的空间不会超过一定的空间,你可以嵌套replace:
replace(replace(replace(replace(myText,' ',' '),' ',' '),' ',' '),' ',' ')
4replace应该固定多达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
这有点蛮力,但会起作用
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
update mytable set myfield = replace (myfield, ' ', ' ') where charindex(' ', myfield) > 0
replace将在所有的双空间工作,不需要放置多个replace。 这是基于集合的解决scheme。
这是我创build的一个简单的函数,用于清理之前或之后的任何空格,以及string中的多个空格。 它优雅地处理在一个单一的伸展约108个空间和string中的块数。 如果需要的话,可以通过添加更多的空格块来增加8倍。 尽pipe它在大型应用程序中被广泛使用,但似乎performance得很快并且没有引起任何问题。
CREATE FUNCTION [dbo].[fnReplaceMultipleSpaces] (@StrVal AS VARCHAR(4000)) RETURNS VARCHAR(4000) AS BEGIN SET @StrVal = Ltrim(@StrVal) SET @StrVal = Rtrim(@StrVal) SET @StrVal = REPLACE(@StrVal, ' ', ' ') -- 16 spaces SET @StrVal = REPLACE(@StrVal, ' ', ' ') -- 8 spaces SET @StrVal = REPLACE(@StrVal, ' ', ' ') -- 4 spaces SET @StrVal = REPLACE(@StrVal, ' ', ' ') -- 2 spaces SET @StrVal = REPLACE(@StrVal, ' ', ' ') -- 2 spaces (for odd leftovers) RETURN @StrVal END
挖掘答案时发现这个:
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
完整的答案(与解释)从以下url取得: http : //techtipsbysatish.blogspot.com/2010/08/sql-server-replace-multiple-spaces-with.html
再看看,似乎只是选定的答案略有不同的版本。
这是通过多个replace的解决scheme,它适用于任何string(不需要特殊字符,不是string的一部分)。
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'
它可以通过recursion函数来完成
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
怎么运行的:
警告:
用于replace空格的字符/string不应该存在于string的开头或结尾,而是独立存在。
方法#1
第一种方法是用不常见的符号组合将单词之间的多余空格replace为临时标记。 然后,您可以使用replace函数而不是循环replace临时标记符号。
这里是一个替代Stringvariables中的文本的代码示例。
DECLARE @testString AS VARCHAR(256) = ' Test text with random* spacing. Please normalize this spacing!'; SELECT REPLACE(REPLACE(REPLACE(@testString, ' ', '*^'), '^*', ''), '*^', ' ');
执行时间testing#1:在这种replace方法的十次运行中,服务器应答的平均等待时间是1.7毫秒,总执行时间是4.6毫秒。 执行时间testing#2:服务器应答的平均等待时间为1.7毫秒,总执行时间为3.7毫秒。
方法#2
第二种方法并不像第一种方法那样优雅,而且也完成了工作。 该方法通过嵌套四个(或者可选地多个)replace语句来替代两个空白空间。
DECLARE @testString AS VARCHAR(256) = ' Test text with random* spacing. Please normalize this spacing!'; SELECT REPLACE(REPLACE(REPLACE(REPLACE(@testString,' ',' '),' ',' '),' ',' '),' ',' ')
执行时间testing#1:在这种replace方法的十次运行中,服务器应答的平均等待时间是1.9毫秒,总执行时间是3.8毫秒。 执行时间testing#2:服务器应答的平均等待时间为1.8毫秒,总执行时间为4.8毫秒。
方法#3
replace单词之间多余空格的第三种方法是使用一个简单的循环。 您可以在while循环中检查多余的空格,然后使用replace函数来减less循环的每次迭代中的额外空间。
DECLARE @testString AS VARCHAR(256) = ' Test text with random* spacing. Please normalize this spacing!'; WHILE CHARINDEX(' ',@testString) > 0 SET @testString = REPLACE(@testString, ' ', ' ') SELECT @testString
执行时间testing#1:在此replace方法的十次运行中,服务器应答的平均等待时间为1.8毫秒,总执行时间为3.4毫秒。 执行时间testing#2:服务器应答的平均等待时间为1.9毫秒,总执行时间为2.8毫秒。
update mytable set myfield = replace(myfield, ' ', ' ') where myfield like '% %'
尝试这个..
你可以试试这个:
select Regexp_Replace('single spaces only','( ){2,}', ' ') from dual;