Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
_djХомяГ
Guest |
Ищите закрывающую скобку ')' и ближайшую запятую слева от скобки |
11 июн 13, 12:10 [14419648] Ответить | Цитировать Сообщить модератору |
ambarka_max Member Откуда: Россия Сообщений: 517 |
Я бы просто искал красный символ. |
11 июн 13, 12:12 [14419664] Ответить | Цитировать Сообщить модератору |
Сергей Викт. Member Откуда: Москва Сообщений: 888 |
Попробуйте так может быть? Коряво, но вроде работает:) 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] Ответить | Цитировать Сообщить модератору |
Сергей Викт. Member Откуда: Москва Сообщений: 888 |
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] Ответить | Цитировать Сообщить модератору |
palem Member Откуда: Сообщений: 13 |
Сергей Викт. Спасибо большое! Я тоже кружился около многострочного решения. |
11 июн 13, 12:35 [14419829] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Сергей Викт. Member Откуда: Москва Сообщений: 888 |
Очень круто!!!))) Правда! |
||
11 июн 13, 12:43 [14419905] Ответить | Цитировать Сообщить модератору |
Cammomile Member Откуда: Сообщений: 1214 |
Knyazev Alexey, идея клевая, но .... set @s ='-1 * object(0, 2, 2.14) +1 * object(0, 2, 3.1415926)' |
11 июн 13, 12:47 [14419938] Ответить | Цитировать Сообщить модератору |
Сергей Викт. Member Откуда: Москва Сообщений: 888 |
да и 1234 тоже....:( Но красиво, бесспорно) |
||
11 июн 13, 12:52 [14420002] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47063 |
![]() Кстати, тот же приём годится - parsename, но после замены запятых на точку |
||||
11 июн 13, 12:55 [14420020] Ответить | Цитировать Сообщить модератору |
Cammomile Member Откуда: Сообщений: 1214 |
Но придумка крутая, да. |
11 июн 13, 12:58 [14420036] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
ЕвгенийВ Member Откуда: Москва Сообщений: 4967 |
А не лучше для таких задач CLR + регулярные выражения? Написать функцию принимающую рег. выражение и входную строку и возвращающую таблицу с колонками - Имя группы, значение, начальный индекс, конечный индекс. Жисть бы сильно упростилась... |
11 июн 13, 13:26 [14420224] Ответить | Цитировать Сообщить модератору |
Knyazev Alexey Member Откуда: Екб -> Мск Сообщений: 10232 Блог |
не спортивно, но обычно так такие задачи и решают |
||
11 июн 13, 13:27 [14420234] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Mikebond Member Откуда: Киев Сообщений: 32 |
... "зато дешево и практично" :-) : 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] Ответить | Цитировать Сообщить модератору |
palem Member Откуда: Сообщений: 13 |
Вот это пищи... Благодарю Господа! |
13 июн 13, 08:15 [14426167] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |