我需要确保一个给定的字段在字符之间不要有多个空格(我不关心所有的空白,而只是关心空间)。
所以
'single spaces only'
需要变成
'single spaces only'
下面的行不通
select replace('single spaces only',' ',' ')
因为这会导致
'single spaces only'
我真的更喜欢使用本地T-SQL,而不是基于CLR的解决方案。
有什么想法吗?
我需要确保一个给定的字段在字符之间不要有多个空格(我不关心所有的空白,而只是关心空间)。
所以
'single spaces only'
需要变成
'single spaces only'
下面的行不通
select replace('single spaces only',' ',' ')
因为这会导致
'single spaces only'
我真的更喜欢使用本地T-SQL,而不是基于CLR的解决方案。
有什么想法吗?
Answers:
更整洁:
select string = replace(replace(replace(' select single spaces',' ','<>'),'><',''),'<>',' ')
输出:
选择单个空格
这将工作:
declare @test varchar(100)
set @test = 'this is a test'
while charindex(' ',@test ) > 0
begin
set @test = replace(@test, ' ', ' ')
end
select @test
"release < now"
,那么你会得到"release<><><<><>now"
,"release<<>now"
,"release< now"
,它与任何对符号的相同,如果你有一对单一个接着它会移到
如果您知道一行中最多只能有一定数量的空格,则可以嵌套替换:
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
可以通过以下函数递归完成:
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
注意:
用于替换空格的字符/字符串在字符串的开头或结尾不应存在,并且不能单独使用。
这有点蛮力,但是可以用
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
这是我创建的一个简单函数,用于清除字符串前后的任何空格以及字符串中的多个空格。它可以一次处理多达108个空格,并且与字符串中的块一样多。如果需要,可以通过添加更多具有较大空格的行来将其增加8倍。尽管它在大型应用程序中得到了普遍使用,但它似乎可以快速执行并且没有引起任何问题。
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
完整答案(带有解释)来自:http : //techtipsbysatish.blogspot.com/2010/08/sql-server-replace-multiple-spaces-with.html
从第二个角度看,似乎只是所选答案的稍有不同。
方法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毫秒。
这是通过多次替换解决的方法,它适用于任何字符串(不需要特殊字符,也不是字符串的一部分)。
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'
我使用FOR XML PATH解决方案将多个空间替换为单个空间
这个想法是用XML标记替换空格,然后将XML字符串分割成没有XML标记的字符串片段,最后通过在两个之间添加单个空格字符来连接这些字符串值
这是最终UDF函数的调用方式
select dbo.ReplaceMultipleSpaces(' Sample text with multiple space ')
只需添加另一种方法-
在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 !
*/
请找到下面的代码
select trim(string_agg(value,' ')) from STRING_SPLIT(' single spaces only ',' ')
where value<>' '
这对我有用。希望这对您有帮助...