Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-86441
Stefan
2003-12-13 13:59
2003.12.26
Как удалить пункт из меню ?


3-86304
DDP1
2003-12-02 13:10
2003.12.26
Постраничная выборка в ADO


1-86416
Макс2
2003-12-13 18:43
2003.12.26
StringGrid


1-86395
Sirus
2003-12-13 07:24
2003.12.26
Application.Handle в DLL из программы типа TaskBar....


7-86574
The X
2003-10-21 19:44
2003.12.26
Определение сер. # HDD (заводского)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский