![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
try .... except в SQL-синтаксисе [D6, MSSQL]
Илайдж © (2003-12-02 11:30:00)
Бодрое утро, страна.
Собственно, есть маленкая проблема.
Имеется поле varchar, в котором хранятся некие float данные. Вы спросите почему varchar? Отвечу, данные могут быть представлены в видах:
- float/float
- меньше float
- <= float
и т.д. и т.п.
Однако, возникла некая потребность вывести график по этим самым float-значениям.
Сейчас на клиенте висит нечто вида string->string, которое (да, кстати, значение может быть представлено как 4.5 и как 4,5)
а) рубит все слова в поле, пробелы
б) заменяет . на ,
в) из float/float берет первый float.
и т.д..
Но вот что интересно.
Такая штука как cast(varchar_field as float) проходит лишь там, где значение varchar_field представляет собой float.
А как быть с обработкой значений выше указанных видов? Ибо если в середине появится что-то что не вписывается в формат - обработка прекращается досрочно.
Буду благодарен за идеи.
Илайдж (2003-12-02 14:50:00) [1]
Хотя я тебя понял, ты привел свой пример на [6].code2, за что отдельное спасибо.
Мда...стал сам себе противоречить =)
Илайдж (2003-12-02 14:49:00) [2]
2SergSuper: гуд, но в случае
- @aa = "<=5.2" вернет 0
- @aa = "5,2" - вылетит с ошибкой =)
SergSuper (2003-12-02 14:43:00) [3]
function xx(@aa varchar)
RETURNS float as
declare @bb float
select @bb=case when isnumeric(@aa)=1 then convert(float, @aa) else 0 end
return @bb
end
Илайдж (2003-12-02 14:30:00) [4]
оцените потугу
CREATE FUNCTION XX (@aa varchar(4000))
RETURNS float as
BEGIN
declare @i int
set @i = 0
while @i < len(@aa)
begin
set @i = @i + 1
if not substring(@aa, @i, 1) in ("0","1","2","3","4","5","6","7","8","9",".",",")
set @aa = replace(@aa, substring(@aa, @i, 1), " ")
end
set @aa = ltrim(rtrim(@aa))
set @i = patindex("% %",@aa)
if @i <> 0
set @aa = substring(@aa, 1, @i-1)
return convert(float,@aa)
END
Функция фозвращает первый нормальный float из списка..Собсно это и было нужно, просто я думал, что есть запись покороче
аля
function xx(@aa varchar)
declare @bb float
try
@bb = convert(float, @aa)
except
@bb = 0
end
return @bb
end
=)
Илайдж (2003-12-02 13:54:00) [5]
2 Sandman25:
собсно проблема в том как это написать =)
пишу - основа
CREATE FUNCTION XX (@aa varchar(4000))
RETURNS float AS
BEGIN
declare @bb float
set @bb = convert(float, @aa)
return @bb
END
но если передать бред, ала @aa = "тест"
то в SQL Query Analyzer выдается ошибка, а хотелось бы видеть скажем 0
вопрос КАК это написать :)
Silver Alex (2003-12-02 12:10:00) [6]
а почему бы не сделать это поле вместо varchar numeric, и добавить еще одно поле например MainType типа Integer, где 0- это меньше float, 1- <= float, 2-это float/float
и т.д., если еще одно поле надо типа numeric (float/float) так добавь и его.Зачем хранить данные типа float в строке?Не догоняю.
Hooch (2003-12-02 12:00:00) [7]
чтоб проверить что строка - число используй ISNUMERIC и все дела.
> кстати, интересная штука в SQL Query Analyzer:
чего тут интересного ? в первом случае нужно длинну VarChar указать, по умолчанию 1
Sandman25 (2003-12-02 11:48:00) [8]
Напишите свою хранимую процедуру/функцию.
Илайдж (2003-12-02 11:37:00) [9]
сорри, не cast а convert
кстати, интересная штука в SQL Query Analyzer:
declare @x float
declare @y varchar
set @y = "4.5"
set @x = convert(float,@y)
print(@x)
Дает 4
declare @x float
declare @y varchar (4000)
set @y = "4.5"
set @x = convert(float,@y)
print(@x)
Дает 4.5
declare @x float
declare @y varchar (100)
set @y = "4,5" или set @y = "меньше 4.5"
set @x = convert(float,@y)
print(@x)
и все остальное, ессно, дает ошибку
Server: Msg 8114, Level 16, State 5, Line 4
Error converting data type varchar to float.
Вот как бы обойти это и скажем вместо ошибки на выходе был 0.0