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

Возможно, вы захотите вставить RTRIM в предложение select в зависимости от данных. – openshac

+0

это действительно не сильно отличается, хотя в любом случае я это сделал :) –

+0

Привет Али, спасибо, я не хочу replcae, если $ найден между строк. Я хочу удалить из begning и end $ only. извините, я не упомянула в этом вопросе. –

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 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 

Это ближе всего вы получите регулярные выражения в T-SQL без использования CLR или Interop.

+0

Если вы пытаетесь заменить заполнители в строке, вы должны использовать некоторую форму регулярного выражения или проверки шаблонов для проверки каждого заполнителя. – Spikeh

+0

Hi Spikeh Спасибо, я не уверен, что первый и последний чатареры будут $ в моем сценарии. –

+0

Я изменил сообщение некоторое время назад, но не видел ваш комментарий до сих пор. Этот код удалит любые знаки $ из строки и удалит из него любые ведущие или конечные пробелы. Вы также можете применить вторую функцию REPLACE(), чтобы удалить оставшиеся двойные пробелы после замены, но она будет работать только для первой итерации; вам нужно будет зацикливать замену до тех пор, пока все двойные пробелы не будут удалены. – Spikeh

Смежные вопросы