powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Как узнать:можно ли преобразовать строку в число?
10 сообщений из 10, страница 1 из 1
Как узнать:можно ли преобразовать строку в число?
    #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
Как узнать:можно ли преобразовать строку в число?
    #32938305
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Явного способа это сделать до сих пор нет. В смысле, нет такой встроенной функции.

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

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

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

Но спасибо за ответ :-)
...
Рейтинг: 0 / 0
Как узнать:можно ли преобразовать строку в число?
    #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
Как узнать:можно ли преобразовать строку в число?
    #32938835
Litus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
:-) забыл вторые case-ы повставлять перед patindex-ами. Но суть, понятна, я
полагаю

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

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


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

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

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

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

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

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


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

Сам знаю, что плохо :-). Стремлюсь, но пока имеем то, что имеем... :-(. Всего сразу не переделаешь
...
Рейтинг: 0 / 0
Как узнать:можно ли преобразовать строку в число?
    #32942064
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я хочу предостеречь от опасности - нужно пытаться преобразовывать только если оно преобразуется. Иначе convert() просто аварийно завершает серверный процесс (соединение слава богу остается). Т.е. ваш код обработки ошибки на TSQL даже не будет пытаться выполниться.
...
Рейтинг: 0 / 0
Как узнать:можно ли преобразовать строку в число?
    #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
10 сообщений из 10, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Как узнать:можно ли преобразовать строку в число?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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