Форум: "Базы";
Текущий архив: 2003.12.26;
Скачать: [xml.tar.bz2];
Внизtry .... except в SQL-синтаксисе Найти похожие ветки
← →
Илайдж (2003-12-02 11:30) [0]Бодрое утро, страна.
Собственно, есть маленкая проблема.
Имеется поле 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 11:37) [1]сорри, не 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
← →
Sandman25 (2003-12-02 11:48) [2]Напишите свою хранимую процедуру/функцию.
← →
Hooch (2003-12-02 12:00) [3]чтоб проверить что строка - число используй ISNUMERIC и все дела.
> кстати, интересная штука в SQL Query Analyzer:
чего тут интересного ? в первом случае нужно длинну VarChar указать, по умолчанию 1
← →
Silver Alex (2003-12-02 12:10) [4]а почему бы не сделать это поле вместо varchar numeric, и добавить еще одно поле например MainType типа Integer, где 0- это меньше float, 1- <= float, 2-это float/float
и т.д., если еще одно поле надо типа numeric (float/float) так добавь и его.Зачем хранить данные типа float в строке?Не догоняю.
← →
Илайдж (2003-12-02 13:54) [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
вопрос КАК это написать :)
← →
Илайдж (2003-12-02 14:30) [6]оцените потугу
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
=)
← →
SergSuper (2003-12-02 14:43) [7]
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:49) [8]2SergSuper: гуд, но в случае
- @aa = "<=5.2" вернет 0
- @aa = "5,2" - вылетит с ошибкой =)
← →
Илайдж (2003-12-02 14:50) [9]Хотя я тебя понял, ты привел свой пример на [6].code2, за что отдельное спасибо.
Мда...стал сам себе противоречить =)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.12.26;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c