2014-01-24 144 views
0

如果給定的字符串匹配,我有一些方法可以刪除字符串的第一個和最後一個字母。在這種情況下給字符串是$如果找到匹配項,請刪除字符串的第一個字母和最後一個字母

實施例:

$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 
+2

你到目前爲止嘗試過什麼?嘗試了'REPLACE'功能? http://technet.microsoft.com/en-us/library/ms186862.aspx – NickyvV

+0

你使用$裏面的單詞嗎? (與**'$ test 3 sql ser $ ver'** - > result-> test 3 sql ser $ ver)相同 –

回答

0

可以使用的東西功能 $與 '替換'

0

試試這個

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

首先替換 '$ $' 與 '',然後替換「 $'與''。 你說什麼:用空格替換,但在你的結果中沒有空格,所以我用空字符串替換它們。你當然可以根據你的需要修改它。 所以這個:

SELECT REPLACE(REPLACE(YourColumn, '$ $', ''),'$','') 
FROM YourTable 
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 ║ 
╚════════════════════╝ 
+0

您可能希望根據數據在select子句中粘貼RTRIM。 – openshac

+0

雖然無論如何我已經做了它並沒有真正做出很大的差異:) –

+0

嗨阿里,謝謝你,我不希望replcae如果$在字符串之間找到。我想從開始移除並只結束$。對不起,我沒有提到這個問題。 –

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 @[email protected][email protected][email protected] 
     SET @position = charindex(@separator,@in,@position) + 1 
    END 


SELECT @out 
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 

這也將努力爲 '$測試$ 7個SQL服務器$',但不會取代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 

這是你在T-SQL中的正則表達式,而不使用CLR或互操作最接近的一次。

+0

如果您試圖在字符串中替換佔位符,則應使用某種形式的正則表達式或模式檢查來驗證每個佔位符。 – Spikeh

+0

嗨Spikeh謝謝你,我不知道在我的場景中,總是首先和最後的特徵將是$。 –

+0

我稍後修改了文章,但直到現在纔看到您的評論。此代碼將從字符串中移除任何$符號,並從其中移除任何前導或尾隨空格。您也可以應用第二個REPLACE()函數來刪除替換後留下的任何雙空格,但它只適用於第一次迭代;您需要循環替換,直到刪除所有雙空白爲止。 – Spikeh

相關問題