Как выделить число из строки ?

НаталияГ
Дата: 16.12.2002 09:57:33
Всем привет. Помогите кто знает, плиз ... есть в SQL какая нить функция которой можно из строки типа "йцу 89цу цууу ." выделить "89" ?
Trong
Дата: 16.12.2002 10:19:55
Вроде как нету. Но написать самому не проблема.
Cat2
Дата: 16.12.2002 10:25:54
Функции такой нет, но на T-SQL это можно сделатьтак:

set nocount on

declare @s varchar(32),@i int,@j int
set @s='йцу 89цу цууу '

set @i=1

while @i<=len(@s)
begin
if (isnumeric(substring(@s,@i,1))=1) break
set @i=@i+1
end

set @j=@i

while @j<=len(@s)
begin
if (isnumeric(substring(@s,@j,1))=0) break
set @j=@j+1
end

select substring(@s,@i,@j-@i)

Бронников Андрей
Дата: 16.12.2002 21:35:32
2 Cat

вместо первого цикла можно использовать patindex, меньше писать
Axr
Дата: 17.12.2002 08:22:25
Деушка, этим советом пользуйтесь осторожно. Работает только если среди остальных символов нет ".","-","+"
Попробуйте, например, @s='йц-у 89цу цууу '
Cat2
Дата: 17.12.2002 09:28:30
Axr совершенно прав. Я забыл дописать, что эта штуковина выделяет первую похожую на число подстроку.

Если точно известно, что искомое число является целым без знака, то проверку на цифру лучше делать

if patindex('%'+substring(@s,@i,1)+'%','0123456789')<>0
mahoune
Дата: 17.12.2002 09:53:20
А регулярные выражения прицепить не легче ?! Все удобней будет :)
LexusR
Дата: 17.12.2002 11:37:12
create function NumFromStr(@Str varchar(250)) returns integer
as
begin
declare @index integer,
@num varchar(250)
set @index = 1
set @num = ''
while @index<=len(@Str)
begin
if ((ascii(substring(@Str,@index,1))>=48)and
(ascii(substring(@Str,@index,1))<=57))
set @num = @num+substring(@Str,@index,1)
set @index = @index+1
end
return(cast(@num as integer))
end

select dbo.NumFromStr('йц-у 89цу цууу')
Cat2
Дата: 17.12.2002 12:41:06
mahoune>
Может и легче, но у меня 7.0. Я и UDF использовать не могу

LexusR> попробуйте свой пример на

set @str='йцу 89цу 12цууу '
Glory
Дата: 17.12.2002 14:47:51
declare @s nvarchar(100), @s1 nvarchar(100), @i int

set @s = N'йцу 89цу цууу '

set @i = patindex('%[1234567890]%', @s)
if @i > 0 set @s1 = substring(@s, @i, 4000)

set @i = patindex('%[^1234567890]%', @s1)
if @i > 0 set @s1 = left(@s1, @i-1)
select @s1


Теоритически все это можно загнать в одно выражение