Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 из строки получить число  [new]
ищущий
Guest
ррлор455отл85 ---> 45585
m5m,5lk4lk ---->554
55лло89л --->5589
27 мар 04, 22:08    [600756]     Ответить | Цитировать Сообщить модератору
 Re: из строки получить число  [new]
Trong
Member

Откуда: Novosibirsk
Сообщений: 759
Не нашел первоисточника, но если ничего не путаю, то автором идеи был SergSuper.
set nocount on

create table #dict(chr nvarchar(1))

declare @i int

set @i = 1

while @i < 256 begin
if char(@i) not like '[0-9]'
insert into #dict values(char(@i))
set @i = @i + 1
end

declare @str nvarchar(200)
set @str = 'ррлор455отл85'
select
@str = replace(@str, chr, '')
from #dict

select @str as [str]

drop table #dict
28 мар 04, 10:42    [600845]     Ответить | Цитировать Сообщить модератору
 Re: из строки получить число  [new]
Green2
Member

Откуда: skype: green2x2
Сообщений: 13748
Версия JScript

<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<TITLE></TITLE>
</HEAD>
<BODY>

<P> </P>
<SCRIPT LANGUAGE=javascript>
<!--

var a=Array("ррлор455отл85","m5m,5lk4lk","55лло89л");
for(var i in a)
{
var mat=a[i].match(/(\d+)/g);
document.write( a[i]+" --> "+mat.join("")+"<br>");


}
//-->

</SCRIPT>

</BODY>
</HTML>
28 мар 04, 14:46    [600925]     Ответить | Цитировать Сообщить модератору
 Re: из строки получить число  [new]
ищущий
Guest
спасибо за пример и за идею. думал, что решается просто, а пришлось через доп. таблицу.
28 мар 04, 16:50    [600961]     Ответить | Цитировать Сообщить модератору
 Re: из строки получить число  [new]
josia
Member

Откуда: http://exactpro.com
Сообщений: 482
Решение с временной таблицей и replace выглядит здорово. Но я бы использовал scalar UDF
CREATE FUNCTION dbo.LeaveOnlyDigits (@str nvarchar(200))

RETURNS nvarchar(200)
AS
BEGIN
DECLARE @resstr nvarchar(200),@tmpstr nvarchar
DECLARE @i int,@n int
SET @resstr = ''
SET @i = 1
SET @n = LEN(@str)
WHILE @i <= @n BEGIN
SET @tmpstr = SUBSTRING(@str,@i,1)
IF (ASCII(@tmpstr) BETWEEN 48 AND 57)
SET @resstr = @resstr + SUBSTRING(@str,@i,1)
SET @i = @i + 1
END
RETURN(@resstr)
END
GO
SELECT dbo.LeaveOnlyDigits('abcde455fgh85')
Мой тест показывает, что с ней работает быстрее решения с доп. таблицей. UDF также удобнее в использовании. Удачи.
28 мар 04, 19:11    [601002]     Ответить | Цитировать Сообщить модератору
 Re: из строки получить число  [new]
MVM
Member

Откуда:
Сообщений: 271
А мне решение приведенное Trong-ом, понравилось. Только чтобы работать в таблицах надо сделать функцию. И загнать список нечисловых символов в постоянную табличку.
1. Создаем табличку-шаблон.
create table dict(str nvarchar(1)) 


declare @i int
set @i = 1

while @i < 256 begin
if char(@i) not like '[0-9]'
insert into dict values(char(@i))
set @i = @i + 1
end

Разовая операция.
2.Создаем UDF

CREATE FUNCTION dbo.IntfromStr (@s VarChar(255))
RETURNS VarChar(255)
AS
BEGIN

select @s = replace(@s, str, '')
from dict

RETURN @s
END

3. И пользуемся!

set nocount on

create table #tt1(str varchar(250))
insert into #tt1
select 'ррлор455отл85' ---> 45585

union all
select 'm5m,5lk4lk' ---->554

union all
select '55лло89л' -->5589


select t.str, dbo.intfromstr(t.str)
from #tt1 t

drop table #tt1
28 мар 04, 22:00    [601045]     Ответить | Цитировать Сообщить модератору
 Re: из строки получить число  [new]
josia
Member

Откуда: http://exactpro.com
Сообщений: 482
Мне решение приведенное Trong-ом тоже понравилось. Однако тест показывает, что оно работает дольше. Нижеприведенный тест выдает: 2113 и 170. То есть intfromstr в 12 раз медленней. Вот если бы удалось сократить число записей в table dict...
DECLARE @str varchar(200),@j int,@t1 datetime

--Use intfromstr

SET @t1 = GETDATE()
SET @j = 0
WHILE @j < 1000 BEGIN
SET @str = dbo.intfromstr('abcde455fgh85')
SET @j = @j+1
END
SELECT DATEDIFF(ms,@t1,GETDATE())
--Use LeaveOnlyDigits

SET @t1 = GETDATE()
SET @j = 0
WHILE @j < 1000 BEGIN
SET @str = dbo.LeaveOnlyDigits('abcde455fgh85')
SET @j = @j+1
END
SELECT DATEDIFF(ms,@t1,GETDATE())
29 мар 04, 01:22    [601095]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить