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

Откуда:
Сообщений: 13
Доброго времени Господа!

есть varchar со значением @txt_in = "-1 * object(0, 2, 9) +1 * object(0, 2, 13)".

Подскажите пожалуйста как из этой строки взять два значения
-1 * object(0, 2, 9) +1 * object(0, 2, 13).

Формат строки не изменяется, значения в скобках могут меняться.
11 июн 13, 12:05    [14419597]     Ответить | Цитировать Сообщить модератору
 Re: Взять подстроку  [new]
_djХомяГ
Guest
Ищите закрывающую скобку ')' и ближайшую запятую слева от скобки
11 июн 13, 12:10    [14419648]     Ответить | Цитировать Сообщить модератору
 Re: Взять подстроку  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Я бы просто искал красный символ.
11 июн 13, 12:12    [14419664]     Ответить | Цитировать Сообщить модератору
 Re: Взять подстроку  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
palem
Доброго времени Господа!

есть varchar со значением @txt_in = "-1 * object(0, 2, 9) +1 * object(0, 2, 13)".

Подскажите пожалуйста как из этой строки взять два значения
-1 * object(0, 2, 9) +1 * object(0, 2, 13).

Формат строки не изменяется, значения в скобках могут меняться.


Попробуйте так может быть? Коряво, но вроде работает:)
declare @txt_in  varchar(256)
declare @str varchar(50)
SET @txt_in='-1 * object(0, 2, 9) +1 * object(0, 2, 13)'
SET @str=@txt_in
SET @str=LEFT(RIGHT(@str,CHARINDEX('+1',@str)-12),LEN(RIGHT(@str,CHARINDEX('+1',@str)-12))-1)
SET @str=RIGHT(@str,LEN(@str)-CHARINDEX(',',@str))
SET @str=RIGHT(@str,LEN(@str)-CHARINDEX(',',@str)-1)
select 'Первое значение: '+RIGHT(LEFT(@txt_in,CHARINDEX('+1',@txt_in)-3),1)
SELECT 'Второе значение: '+@str
11 июн 13, 12:26    [14419769]     Ответить | Цитировать Сообщить модератору
 Re: Взять подстроку  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
+ Извиняюсь...
Сергей Викт.
palem
Доброго времени Господа!

есть varchar со значением @txt_in = "-1 * object(0, 2, 9) +1 * object(0, 2, 13)".

Подскажите пожалуйста как из этой строки взять два значения
-1 * object(0, 2, 9) +1 * object(0, 2, 13).

Формат строки не изменяется, значения в скобках могут меняться.


Попробуйте так может быть? Коряво, но вроде работает:)
declare @txt_in  varchar(256)
declare @str varchar(50)
SET @txt_in='-1 * object(0, 2, 9) +1 * object(0, 2, 13)'
SET @str=@txt_in
SET @str=LEFT(RIGHT(@str,CHARINDEX('+1',@str)-12),LEN(RIGHT(@str,CHARINDEX('+1',@str)-12))-1)
SET @str=RIGHT(@str,LEN(@str)-CHARINDEX(',',@str))
SET @str=RIGHT(@str,LEN(@str)-CHARINDEX(',',@str)-1)
select 'Первое значение: '+RIGHT(LEFT(@txt_in,CHARINDEX('+1',@txt_in)-3),1)
SELECT 'Второе значение: '+@str

declare @txt_in  varchar(256)
declare @str varchar(50)
SET @txt_in='-1 * object(0, 2, 8974) +1 * object(0, 2, 1113)'
SET @str=@txt_in
SET @str=LEFT(@txt_in,CHARINDEX('+1',@txt_in)-3)
SET @str=RIGHT(@str,LEN(@str)-CHARINDEX(',',@str))
SET @str=RIGHT(@str,LEN(@str)-CHARINDEX(',',@str)-1)
select 'Первое значение: '+@str
SET @str=@txt_in
SET @str=LEFT(RIGHT(@str,CHARINDEX('+1',@str)-12),LEN(RIGHT(@str,CHARINDEX('+1',@str)-12))-1)
SET @str=RIGHT(@str,LEN(@str)-CHARINDEX(',',@str))
SET @str=RIGHT(@str,LEN(@str)-CHARINDEX(',',@str)-1)
SELECT 'Второе значение: '+@str

Я для первого накосячил:)
11 июн 13, 12:33    [14419816]     Ответить | Цитировать Сообщить модератору
 Re: Взять подстроку  [new]
palem
Member

Откуда:
Сообщений: 13
Сергей Викт. Спасибо большое! Я тоже кружился около многострочного решения.
11 июн 13, 12:35    [14419829]     Ответить | Цитировать Сообщить модератору
 Re: Взять подстроку  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10232
Блог
declare @s varchar(50) ='-1 * object(0, 2, 9) +1 * object(0, 2, 13)'
select right(parsename(replace(@s+' ',')','.'), 3),2) as [object_1]
     , right(parsename(replace(@s+' ',')','.'), 2),2) as [object_2]
11 июн 13, 12:38    [14419843]     Ответить | Цитировать Сообщить модератору
 Re: Взять подстроку  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
DECLARE @txt_in varchar (100) 
DECLARE @buf  varchar(100) 
SET @txt_in = '-1 * object(0, 2, 1239) +1 * object(0, 2, 5678)'
SET @buf = LEFT (REVERSE(LEFT(@txt_in, CHARINDEX(')', @txt_in) )),CHARINDEX( ',', REVERSE(LEFT(@txt_in, CHARINDEX(')', @txt_in) ))))  
SELECT  REVERSE(REPLACE(REPLACE(REPLACE(@buf,')','') ,' ',''), ',', '') ) 
SET @buf =  LEFT(REVERSE(@txt_in), CHARINDEX(',', REVERSE(@txt_in)))
SELECT  REVERSE(REPLACE(REPLACE(REPLACE(@buf,')',''), ' ', ''),',', ''))
11 июн 13, 12:43    [14419892]     Ответить | Цитировать Сообщить модератору
 Re: Взять подстроку  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Knyazev Alexey
declare @s varchar(50) ='-1 * object(0, 2, 9) +1 * object(0, 2, 13)'
select right(parsename(replace(@s+' ',')','.'), 3),2) as [object_1]
     , right(parsename(replace(@s+' ',')','.'), 2),2) as [object_2]

Очень круто!!!))) Правда!
11 июн 13, 12:43    [14419905]     Ответить | Цитировать Сообщить модератору
 Re: Взять подстроку  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Knyazev Alexey, идея клевая, но ....


set  @s ='-1 * object(0, 2, 2.14) +1 * object(0, 2, 3.1415926)'
11 июн 13, 12:47    [14419938]     Ответить | Цитировать Сообщить модератору
 Re: Взять подстроку  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Cammomile
Knyazev Alexey, идея клевая, но ....


set  @s ='-1 * object(0, 2, 2.14) +1 * object(0, 2, 3.1415926)'

да и 1234 тоже....:( Но красиво, бесспорно)
11 июн 13, 12:52    [14420002]     Ответить | Цитировать Сообщить модератору
 Re: Взять подстроку  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
Сергей Викт.
Cammomile
Knyazev Alexey, идея клевая, но ....


set  @s ='-1 * object(0, 2, 2.14) +1 * object(0, 2, 3.1415926)'


да и 1234 тоже....:( Но красиво, бесспорно)
Ну так замените RIGHT() на нахождение запятой и откусывание строки там, где надо
Кстати, тот же приём годится - parsename, но после замены запятых на точку
11 июн 13, 12:55    [14420020]     Ответить | Цитировать Сообщить модератору
 Re: Взять подстроку  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Но придумка крутая, да.
11 июн 13, 12:58    [14420036]     Ответить | Цитировать Сообщить модератору
 Re: Взять подстроку  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10232
Блог
declare @t table ( id int identity, obj varchar(100) )
insert into @t
values ( '-1 * object(0, 2, 9)    + 1 * object(0, 2, 13)'        )
     , ( '-1 * object(0, 2, 1239) + 1 * object(0, 2, 5678)'      )
     , ( '-1 * object(0, 2, 2.14) + 1 * object(0, 2, 3.1415926)' )


select id, substring ( obj, i4 + 1, i2 - i4 - 1 ) as [object] 
from
(
select distinct id, obj
     , charindex( '(', t2.obj, number ) i1
     , charindex( ')', t2.obj, number ) i2
     , charindex( ',', t2.obj, number ) i3
     , charindex( ',', t2.obj, number + 5 ) i4
  from master..spt_values t1
    inner join @t t2
      on t1.type = 'P' 
     and t1.number between 0 and len( t2.obj )
) t
where i1 < i2 and i3 < i4
11 июн 13, 13:22    [14420204]     Ответить | Цитировать Сообщить модератору
 Re: Взять подстроку  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4967
А не лучше для таких задач CLR + регулярные выражения?
Написать функцию принимающую рег. выражение и входную строку и возвращающую таблицу с колонками - Имя группы, значение, начальный индекс, конечный индекс.
Жисть бы сильно упростилась...
11 июн 13, 13:26    [14420224]     Ответить | Цитировать Сообщить модератору
 Re: Взять подстроку  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10232
Блог
ЕвгенийВ
А не лучше для таких задач CLR + регулярные выражения?

не спортивно, но обычно так такие задачи и решают
11 июн 13, 13:27    [14420234]     Ответить | Цитировать Сообщить модератору
 Re: Взять подстроку  [new]
aleks2
Guest
declare @s varchar(50) ='-1 * object(0, 2, 9) +1 * object(0, 2, 13)'
select left(@s, charindex('+', @s)-1), substring(@s, charindex('+', @s)+1, 4000)
11 июн 13, 13:28    [14420241]     Ответить | Цитировать Сообщить модератору
 Re: Взять подстроку  [new]
Mikebond
Member

Откуда: Киев
Сообщений: 32
Knyazev Alexey
ЕвгенийВ
А не лучше для таких задач CLR + регулярные выражения?

не спортивно, но обычно так такие задачи и решают


... "зато дешево и практично" :-) :
declare @s varchar(128), @s1 varchar(16), @s2 varchar(16)

set @s = replace('-1 * object(0, 2, 9.5) + 1 * object(0, 2, 3.1415926)',')',' )') 

exec xp_sscanf @s , '-1 * object(0, 2, %s ) + 1 * object(0, 2, %s)', @s1 output, @s2 output
select @s1,@s2
12 июн 13, 03:07    [14423760]     Ответить | Цитировать Сообщить модератору
 Re: Взять подстроку  [new]
palem
Member

Откуда:
Сообщений: 13
Вот это пищи... Благодарю Господа!
13 июн 13, 08:15    [14426167]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить