Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как заменить конкретный символ в строке  [new]
DIG-Master1
Guest
Есть произвольная строка вида:

'дней /5/ и /20/'

Надо привести ее к виду:

'дней (5) и (20)'

Че-то не могу понять как заменить первый слеш на скобку '(' а второй на ')'..
Подскажите :)
29 янв 13, 14:52    [13844754]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить конкретный символ в строке  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
DIG-Master1,
а почему такие глаза?
29 янв 13, 14:54    [13844766]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить конкретный символ в строке  [new]
DIG-Master1
Guest
ZVER-10,

да сам в шоке, что не пойму такой просто вопрос.

вот координаты первых двух скобок нашел а дальше торможу

select CHARINDEX('/', @string) --первая скобка
select CHARINDEX('/', @string,
CHARINDEX('/', @string)+1
) -- вторая
29 янв 13, 14:57    [13844784]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить конкретный символ в строке  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
устроит?
select replace(replace('дней /5/ и /20/',' /',' ('),'/',')')
29 янв 13, 15:05    [13844853]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить конкретный символ в строке  [new]
//5//
Guest
что нужно делать со строкой вида ?

'дней //5// и //20//'
29 янв 13, 15:44    [13845197]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить конкретный символ в строке  [new]
icprog
Member

Откуда:
Сообщений: 166
//5//,

Соответственно
select replace(replace('дней //5// и //20//',' //',' ('),'//',')')
29 янв 13, 15:56    [13845301]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить конкретный символ в строке  [new]
//5//
Guest
icprog
//5//,

Соответственно
select replace(replace('дней //5// и //20//',' //',' ('),'//',')')

а почему не
'дней ((5)) и ((20))'

или
'дней ()5() и ()20()'

?
29 янв 13, 16:00    [13845351]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить конкретный символ в строке  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
а если ввести обозначение X = зачеркнутая /, то задачу можно расширить до типа такой: из пары задвоенныех / первый зачеркнуть, убрать все зачеркнутые X, результат представить в виде: если перед числом зачеркнуто столько же, сколько после числа, то [5] [20], если исправления не парные, то {5} {20}, а если зачеркиваний не было, то (5) (20)
29 янв 13, 16:10    [13845433]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить конкретный символ в строке  [new]
Гость333
Member

Откуда:
Сообщений: 3683
-- Вспомогательная таблица чисел
set nocount on;
declare @numbers table(n int primary key);
declare @i int;
set @i = 1;
while @i <= 1000
begin
   insert @numbers values(@i);
   set @i = @i + 1;
end;

-- Подготовка данных
declare @tab table (id int, string varchar(1000));

insert @tab values(1, 'дней /5/ и /20/');
insert @tab values(2, 'дней /11/ и / 15 / и /30 /   ');
insert @tab values(3, 'дней /2/ и/6/ и /7   ');
insert @tab values(4, '/////');
insert @tab values(5, '<Разные XML-символы> '' " /test/');

-- Преобразование данных
with cte as
(  select t.id, t.string, n.n,
          substring(t.string, n.n, charindex('/', '/' + t.string + '/', n.n + 1) - n.n - 1) as part,
          row_number() over(partition by t.id order by n.n) % 2 as flag
   from @tab t
        inner join @numbers n on n.n <= len(t.string) + 1 and substring('/' + t.string + '/', n.n, 1) = '/'
)
select c.id, c.string, z.new_string
from cte c
     cross apply
     (  select stuff
               ( ( select case when c1.flag = 1 then ')' else '(' end + c1.part
                   from cte c1
                   where c1.id = c.id
                   order by c.n
                   for xml path(''), type
                 ).value('.', 'varchar(max)'),
                 1, 1, ''
               ) new_string
     ) z
where c.n = 1;
29 янв 13, 16:20    [13845516]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить конкретный символ в строке  [new]
DIG-Master
Member

Откуда:
Сообщений: 14
Гость333, Спасибо огромное! офигеть
29 янв 13, 16:28    [13845590]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить конкретный символ в строке  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
DIG-Master,
declare @str varchar(max)= 'qwer/tyuiop/qwert/yuio/p';
declare @i int=1;
declare @CHARINDEX int;
set @CHARINDEX =CHARINDEX('/', @str);

while 1=1
	begin		
		set @CHARINDEX =CHARINDEX('/', @str);
		if @CHARINDEX=0
			break;
        if @i%2=0       
			set @str= STUFF (@str, @CHARINDEX , 1 , ')') ;
		else
			set @str= STUFF (@str, @CHARINDEX , 1 , '(') ;
		set @i = @i + 1;

	end
 select @str;
29 янв 13, 16:52    [13845800]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить конкретный символ в строке  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
вот еще такой вариант

--'дней /5/ и /20/'
declare @str varchar(max)
set @str = '/////'
;with numbers as(
SELECT  top 100000  ROW_NUMBER() over(order by (select 1)) - 1 N
FROM   master..spt_values t1,master..spt_values t2
)
, letters as(select 
	SUBSTRING(@str,N+1,1) symbol
	,N
from	numbers 
where N<LEN(@str))
,letters2 as(
select
*

,rank() over(partition by case when symbol ='/' then 1 else 0 end order by N)*
case when symbol ='/' then 1 else 0 end  invariant

from letters
)
,letters3 as(
select
* 

from letters2
where invariant<>0
)
select
@str=stuff(@str,N+1,1,case when invariant%2=1 then '(' else ')' end)
from letters3

select @str
		
29 янв 13, 17:04    [13845897]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить конкретный символ в строке  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
в рекурсивный СТЕ впихнуть ну никак не получилось( вот, по старинке...
+ Обработка через функцию
if OBJECT_ID('dbo.parenthes','FN') is not null drop function dbo.parenthes
GO
create function dbo.parenthes(@string varchar(1000), @step int) returns varchar(1000) as
begin
   declare @fst int = charindex('/', @string)
   if(@fst=0)return @string
   return dbo.parenthes(stuff(@string,@fst,1,case when @step=0 then '(' else ')' end),(@step+1)%2)
end
GO

-- Подготовка данных
declare @tab table (id int, string varchar(1000));
insert @tab values
   (1, 'дней /5/ и /20/'),(2, 'дней /11/ и / 15 / и /30 /   '),(3, 'дней /2/ и/6/ и /7   '),
   (4, '/////'),(5, '<Разные XML-символы> '' " /test/'),(6, 'текст без требуемых символов')

-- через функцию
SELECT 
   e.id, e.string, 
   dbo.parenthes(e.string,0) fn
FROM @tab e
29 янв 13, 20:55    [13847338]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить конкретный символ в строке  [new]
Shtriga
Member

Откуда:
Сообщений: 1
можно ведь проще намного сделать заметь " /" ----> " (" а "/ " ---> ") "
30 янв 13, 08:59    [13848530]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить конкретный символ в строке  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Shtriga
можно ведь проще намного сделать заметь " /" ----> " (" а "/ " ---> ") "

Ну подобное давно уже сделано: 13844853
Нет уверенности, что перед каждым "открывающим" слэшем будет пробел.
30 янв 13, 09:11    [13848591]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить