如果找到匹配项,请删除首字母和最后一个字

时间:2014-01-24 10:15:59

标签: 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

6 个答案:

答案 0 :(得分:1)

首先用''替换'$ $',然后用''替换'$'。 你在哪里说:用空格替换,但在你的结果中没有空格所以我用空字符串替换它们。您可以根据自己的需要进行修改。 所以这个:

SELECT REPLACE(REPLACE(YourColumn, '$ $', ''),'$','')
FROM YourTable

答案 1 :(得分:1)

您的数据

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  ║
╚════════════════════╝

答案 2 :(得分:0)

您可以使用Stuff功能 将$替换为''

答案 3 :(得分:0)

试试这个

SELECT REPLACE('$test 1 sql server$','$','');

答案 4 :(得分:0)

您可以用''替换$但在这个不起作用的例子中:

 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

答案 5 :(得分:0)

如果您要在几个不同的地方使用这种方法,那么创建一个标量函数,并做一个简单的替换:

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或互操作的情况下最接近T-SQl中的正则表达式。