2014-01-24 3 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

당신은 다음 '교체'와 '$ $'대체이

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

'$'로 교체 물건 기능 을 사용할 수 있습니다 $ '와' '. 다음과 같이 말하면 공백으로 바뀌지 만 결과에는 공백이 없으므로 빈 문자열로 바꿉니다. 물론 필요에 맞게 수정할 수 있습니다. 그래서이 :

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) = '$' 

결과 설정

,584,231,
+0

데이터에 따라 select 절에 RTRIM을 붙이면됩니다. – openshac

+0

어쨌든 나는 그것을 한 많은 differece 만들지 않습니다 :) –

+0

안녕하세요, $ 문자열 사이에 발견 replicae 싶지 않아 고마워요. 나는 처음부터 제거하고 $ 만 끝내고 싶다. 미안하지만 나는이 질문에서 언급하지 않았다. –

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

이 방법 A를 사용하려고하는 경우

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 

이 말은 CLR 또는 상호 운용성을 사용하지 않고 T-SQL에서 정규 표현식에 도착 가장 가까운 여기에 사용할 수있는이 기능과 동일한 기능입니다.

+0

문자열에서 자리 표시자를 바꾸려는 경우 정규 표현식 또는 패턴 확인 형식을 사용하여 각 자리 표시 자의 유효성을 검사해야합니다. – Spikeh

+0

안녕하세요 스파이크 고맙습니다. 제 첫 번째와 마지막 캐릭터가 내 시나리오에서 $가 될지 잘 모르겠습니다. –

+0

잠시 후 게시물을 수정했지만 지금까지 귀하의 의견을 보지 못했습니다. 이 코드는 문자열에서 $ 기호를 제거하고 그 앞에 오는 공백을 제거합니다. 두 번째 REPLACE() 함수를 적용하여 교체 후 남아있는 이중 공백을 제거 할 수도 있지만 첫 번째 반복에만 작동합니다. 모든 이중 공백이 제거 될 때까지 대체 루프를 반복해야합니다. – Spikeh

관련 문제