Sql 如果找到匹配项,请删除字符串的第一个和最后一个字母
如果给定的字符串匹配,我有一些场景可以删除字符串的第一个和最后一个字母。在此场景中,给定字符串为Sql 如果找到匹配项,请删除字符串的第一个和最后一个字母,sql,sql-server,Sql,Sql Server,如果给定的字符串匹配,我有一些场景可以删除字符串的第一个和最后一个字母。在此场景中,给定字符串为$ 例如: $test 1 sql server$ $ $test 2 sql server test 3 sql server$ $ $test 4 sql server test 5 sql server $test 6 sql server 如果第一个和最后一个字符包含字符串中的$,请删除。并删除第二行开头和第三行结尾的两个带空格的$ 要求的结果
$
例如:
$test 1 sql server$
$ $test 2 sql server
test 3 sql server$ $
$test 4 sql server
test 5 sql server
$test 6 sql server
如果第一个和最后一个字符包含字符串中的$
,请删除。并删除第二行开头和第三行结尾的两个带空格的$
要求的结果
test 1 sql server
test 2 sql server
test 3 sql server
test 4 sql server
test 5 sql server
test 6 sql server
你可以使用Stuff函数
将$替换为“”试试这个
SELECT REPLACE('$test 1 sql server$','$','');
首先将“$$”替换为“”,然后将“$”替换为“”。
你在哪里说:替换为空格,但是在你的结果中没有空格,所以我用空字符串替换了它们。当然,你可以根据自己的需要修改它。
因此:
SELECT REPLACE(REPLACE(YourColumn, '$ $', ''),'$','')
FROM YourTable
您的数据
DECLARE @TABLE TABLE (Value VARCHAR(100))
INSERT INTO @TABLE VALUES
('$test 1 sql server$'),
('$ $test 2 sql server'),
('$test 3 sql server$ '),
('$test 4 sql server'),
('test 5 sql server'),
('$test 6 sql server')
查询
SELECT RTRIM(LTRIM(REPLACE(Value, '$', ''))) AS Fixed
FROM @TABLE
WHERE LEFT(LTRIM(Value), 1) = '$'
OR RIGHT(LTRIM(Value), 1) = '$'
结果集
╔════════════════════╗
║ Fixed ║
╠════════════════════╣
║ test 1 sql server ║
║ test 2 sql server ║
║ test 3 sql server ║
║ test 4 sql server ║
║ test 6 sql server ║
╚════════════════════╝
您可以将$替换为“”,但在本例中,这不起作用:
test 3 sql ser$ver$ $
但是这个算法工作得很好:
DECLARE @in NVARCHAR(MAX)
DECLARE @out NVARCHAR(MAX)
SET @in=' test 3 sql server$ $'
SET @out=''
DECLARE @separator NCHAR(1)
SET @separator=' '
DECLARE @position int
SET @position = 1
SET @in = @in + @separator
WHILE charindex(@separator,@in,@position) <> 0
BEGIN
DECLARE @word NVARCHAR(MAX)
SET @word = substring(@in, @position, charindex(@separator,@in,@position) - @position)
IF (LEN(@Word)=1 AND @Word='$') SET @Word=''
ELSE
BEGIN
IF (SUBSTRING(@Word,1,1)='$') SET @Word=SUBSTRING(@Word,2,LEN(@word))
IF (SUBSTRING(@Word,LEN(@word),1)='$') SET @Word=SUBSTRING(@Word,1,LEN(@word)-1)
END
SET @out=@out+@separator+@word
SET @position = charindex(@separator,@in,@position) + 1
END
SELECT @out
在NVARCHAR中声明@(最大值)
声明@out NVARCHAR(最大值)
SET@in='测试3 sql server$$'
设置@out=“”
声明@NCHAR分隔符(1)
设置@separator=''
声明@positionint
设置@position=1
设置@in=@in+@分隔符
而charindex(@separator,@in,@position)0
开始
声明@word NVARCHAR(最大值)
设置@word=substring(@in,@position,charindex(@separator,@in,@position)-@position)
如果(LEN(@Word)=1和@Word='$')设置为@Word=''
其他的
开始
IF(子字符串(@Word,1,1)='$')SET@Word=SUBSTRING(@Word,2,LEN(@Word))
如果(子字符串(@Word,LEN(@Word),1)='$')设置@Word=SUBSTRING(@Word,1,LEN(@Word)-1
结束
设置@out=@out+@separator+@word
设置@position=charindex(@separator,@in,@position)+1
结束
选择@out
如果要在几个不同的地方大量使用此方法,请创建一个标量函数,并进行简单的替换:
IF OBJECT_ID (N'dbo.StripTokens', N'FN') IS NOT NULL
DROP FUNCTION dbo.StripTokens;
GO
CREATE FUNCTION dbo.StripTokens (@string VARCHAR(MAX), @token CHAR(1))
RETURNS VARCHAR(MAX)
WITH EXECUTE AS CALLER
AS
BEGIN
DECLARE @outputString VARCHAR(MAX)
SET @outputString = REPLACE(@string, @token, '')
SET @outputString = REPLACE(@outputString, ' ', ' ')
SET @outputString = RTRIM(LTRIM(@outputString))
RETURN(@outputString);
END;
在使用中:
PRINT dbo.StripTokens('$test 1 sql server$', '$')
PRINT dbo.StripTokens('$ $test 2 sql server', '$')
PRINT dbo.StripTokens('test 3 sql server$ $', '$')
PRINT dbo.StripTokens('$test 4 sql server', '$')
PRINT dbo.StripTokens('test 5 sql server', '$')
PRINT dbo.StripTokens('$test 6 sql server', '$')
产生:
test 1 sql server
test 2 sql server
test 3 sql server
test 4 sql server
test 5 sql server
test 6 sql server
这也适用于“$test$7 sql server$”,但不会替换2个以上的多个空格:
PRINT dbo.StripTokens('$test $7 sql server$', '$')
PRINT dbo.StripTokens('$test $ $8 sql server', '$')
结果:
test 7 sql server
test 8 sql server
要替换多个空格,您需要创建一个循环,使用PATINDEX检查是否还有剩余的双空格。以下是与此功能相同的功能:
IF OBJECT_ID (N'dbo.StripTokens', N'FN') IS NOT NULL
DROP FUNCTION dbo.StripTokens;
GO
CREATE FUNCTION dbo.StripTokens (@string VARCHAR(MAX), @token CHAR(1))
RETURNS VARCHAR(MAX)
WITH EXECUTE AS CALLER
AS
BEGIN
DECLARE @outputString VARCHAR(MAX)
SET @outputString = REPLACE(@string, @token, '')
WHILE(1 = 1)
BEGIN
IF PATINDEX('% %', @outputString) > 0
BEGIN
SET @outputString = REPLACE(@outputString, ' ', ' ')
END
ELSE
BREAK
END
SET @outputString = RTRIM(LTRIM(@outputString))
RETURN(@outputString);
END;
GO
PRINT dbo.StripTokens('$test 1 sql server$', '$')
PRINT dbo.StripTokens('$ $test 2 sql server', '$')
PRINT dbo.StripTokens('test 3 sql server$ $', '$')
PRINT dbo.StripTokens('$test 4 sql server', '$')
PRINT dbo.StripTokens('test 5 sql server', '$')
PRINT dbo.StripTokens('$test 6 sql server', '$')
PRINT dbo.StripTokens('$test $7 sql server$', '$')
PRINT dbo.StripTokens('$test $ $8 sql server', '$')
返回:
test 1 sql server
test 2 sql server
test 3 sql server
test 4 sql server
test 5 sql server
test 6 sql server
test 7 sql server
test 8 sql server
这是在不使用CLR或interop的情况下与T-SQl中的正则表达式最接近的地方。到目前为止,您尝试了什么?是否尝试了
REPLACE
功能?您是否在单词中使用$?(与“$test 3 sql ser$ver”->result->test 3 sql ser$ver”相同)您可能希望根据数据在select子句上粘贴一个RTRIM。它实际上没有太大区别,尽管我已经这样做了:)嗨,阿里,谢谢您,如果在字符串之间找到$,我不想回复。我只想从开始和结束中删除$。很抱歉,我在这个问题中没有提到。如果你试图替换字符串中的占位符,那么你应该使用某种形式的正则表达式或模式检查来验证每个占位符。嗨,斯派克,谢谢,我不确定在我的场景中所有的第一个和最后一个字符都是$。我不久前修改了帖子,但直到现在才看到你的评论。此代码将从字符串中删除任何$符号,并从中删除任何前导或尾随空格。您还可以应用第二个REPLACE()函数来删除替换后剩余的任何双空格,但它只适用于第一次迭代;您需要循环替换,直到删除所有双空格。@RajeshGK我已经更新了我的答案,以包含一个全面的示例。