Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Как узнать:можно ли преобразовать строку в число? / 10 сообщений из 10, страница 1 из 1
01.03.2005, 12:01
    #32938251
passlight
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать:можно ли преобразовать строку в число?
Здравствуйте.

Имеется ASE 12.5.1, таблица X с полем Z типа varchar(255).

Вопрос: каким образом можно узнать можно ли преобразовать поле Z в число?
То есть - сможет ли convert(float,X.Z) сработать корректно или вызовет ошибку вида "Error: Number (249) Syntax error during explicit conversion of VARCHAR value 'ddd' to a FLOAT field."

Спасибо.
...
Рейтинг: 0 / 0
01.03.2005, 12:16
    #32938305
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать:можно ли преобразовать строку в число?
Явного способа это сделать до сих пор нет. В смысле, нет такой встроенной функции.

Но можно сделать что-то типа

patindex('%[^1234567890]%', <field_or_var_name> ) = 0
Для float немного по-другому
patindex('%[^-.1234567890]%', <field_or_var_name> ) = 0

Ну и все равно результат не до конца гарантирован - может быть строка типа
'123.456.789-' или вообще тривиальный выход из диапазона допустимых значений.
...
Рейтинг: 0 / 0
01.03.2005, 12:20
    #32938321
passlight
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать:можно ли преобразовать строку в число?
Очень жаль. Структура базы такова, что в этом поле может находиться не только число, но и строка любого произвольного вида...

Но спасибо за ответ :-)
...
Рейтинг: 0 / 0
01.03.2005, 14:44
    #32938827
Litus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать:можно ли преобразовать строку в число?
В цикле очень просто все можно проанализировать по одному символику.
Ну а если в селекте, то можно извратиться так...
например для целых чисел:

case char_length(<field_or_var_name>)
when 1 then patindex('[0-9]', <field_or_var_name> ) <> 0 then convert(....
when 2 then patindex('[0-9][0-9]', <field_or_var_name> ) <> 0 then
convert(....
when 3 then patindex('[0-9][0-9][0-9]', <field_or_var_name> ) <> 0 then
convert(....
...
when 18 then
patindex('[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]',
<field_or_var_name> ) <> 0 then convert(....
else
0
end



Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
01.03.2005, 14:46
    #32938835
Litus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать:можно ли преобразовать строку в число?
:-) забыл вторые case-ы повставлять перед patindex-ами. Но суть, понятна, я
полагаю

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
02.03.2005, 10:56
    #32940458
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать:можно ли преобразовать строку в число?
passlightОчень жаль. Структура базы такова, что в этом поле может находиться не только число, но и строка любого произвольного вида...

Но спасибо за ответ :-)


Это плохо, что такая структура. Переделывай :-))
...
Рейтинг: 0 / 0
02.03.2005, 13:58
    #32941123
michael_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать:можно ли преобразовать строку в число?
Числовое представление строки нужно для сортировок и выборок?

Если, да, то проще завести 2-е поле типа NUMERIC и заносить туда числовое представление строки с помощью триггера, или если логика слишком сложная, то спомощью клиентского приложения.

Такой подход позволит правильно отсортировать такую последовательность:

строка число
1 1
10 10
11 11
11а 11
11б 11
12 12

select строка from t order by число,строка
...
Рейтинг: 0 / 0
02.03.2005, 15:41
    #32941575
passlight
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать:можно ли преобразовать строку в число?
MasterZiv passlightОчень жаль. Структура базы такова, что в этом поле может находиться не только число, но и строка любого произвольного вида...

Но спасибо за ответ :-)


Это плохо, что такая структура. Переделывай :-))

Сам знаю, что плохо :-). Стремлюсь, но пока имеем то, что имеем... :-(. Всего сразу не переделаешь
...
Рейтинг: 0 / 0
02.03.2005, 17:46
    #32942064
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать:можно ли преобразовать строку в число?
Я хочу предостеречь от опасности - нужно пытаться преобразовывать только если оно преобразуется. Иначе convert() просто аварийно завершает серверный процесс (соединение слава богу остается). Т.е. ваш код обработки ошибки на TSQL даже не будет пытаться выполниться.
...
Рейтинг: 0 / 0
03.03.2005, 12:24
    #32943327
passlight
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать:можно ли преобразовать строку в число?
MasterZivЯ хочу предостеречь от опасности - нужно пытаться преобразовывать только если оно преобразуется. Иначе convert() просто аварийно завершает серверный процесс (соединение слава богу остается). Т.е. ваш код обработки ошибки на TSQL даже не будет пытаться выполниться.

Спасибо за предостережение. Я уже понял, что если не получится преобразовать, то ошибку обработать не удается. Сочинил с вашей помощью что-то вроде этого:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
CREATE PROCEDURE dbo.IsNumber
(@s varchar( 255 ))
as
declare 
  @buf varchar( 255 ),
  @incminus int,
  @incdot   int,
  @i   int
begin

  select @i = patindex('%[^-.1234567890]%', @s )
  if @i >  0  
  begin
--  "число содержит некорректные символы"
    select - 1 
    return
  end

  select @i = patindex('%[-]%', @s) 
  if @i >  1  
  begin
--  "знак минус в числе должен стоять на первом месте"
    select - 2 
    return
  end

  select @incminus =  0 
  select @incdot =  0 
  select @i =  1 
  while @i <= len(@s)
  begin
    select @buf = substring(@s, @i,  1 )
    select @incminus = @incminus + case when @buf = "-" then  1  else  0  end
    select @incdot = @incdot + case when @buf = "." then  1  else  0  end
    select @i = @i +  1 
  end
   
  if (@incminus >  1 ) or (@incdot > 1 )
  begin
-- "знак минус или точка в числе встречается больше одного раза"
    select - 3 
    return
  end

  select  0   
end

Придется курсором пробежаться по данным и подсовывать их этой ХП.
Может быть можно оптимальнее?

Спасибо! :-)
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Как узнать:можно ли преобразовать строку в число? / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]