Форум программистов, компьютерный форум, киберфорум
Firebird/InterBase
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/26: Рейтинг темы: голосов - 26, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 19.05.2011
Сообщений: 89
1

Выделить число

26.07.2012, 17:51. Показов 4671. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!

есть строки содержащие числа, например: 1А, 8В, 10С, 5/3 и т.д.

мне нужно получить число из этих строк, причем до первого не числового символа. Есть ли такая возможность в firebird?????

Поясню зачем, мне нужно отсортировать значения в запросе и я хочу к числу меньшему 10 приставить 0 (нолик), чтобы сортировалось правильно. А то, например, если этого не делать то 10А будет выше чем 8А.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.07.2012, 17:51
Ответы с готовыми решениями:

Выделить в массиве число выделить его каким-нибудь цветом
Выделить минимальное и максимальное значение в массиве каким-нибудь цветом отличающимся от...

Вводится число, выделить в нем каждую цифру и записать число в обратном порядке
Вводится число, выделить в нем каждую цифру и записать число в обратном порядке.

Выделить число
Всем привет помогите нуба у меня есть int num = 123; как делать чтоб смог в консольке печатать...

Выделить число в календаре!
Привет всем!!) Ребята есть компонент TMonthCalenar и ест список дат, которые должны быть в нем...

11
3142 / 1310 / 468
Регистрация: 31.05.2012
Сообщений: 4,646
26.07.2012, 20:42 2
Как вариант - написать udf-функцию
1
912 / 877 / 62
Регистрация: 06.01.2010
Сообщений: 2,367
Записей в блоге: 6
26.07.2012, 22:58 3
Цитата Сообщение от vso Посмотреть сообщение
Поясню зачем, мне нужно отсортировать значения в запросе и я хочу к числу меньшему 10 приставить 0 (нолик), чтобы сортировалось правильно. А то, например, если этого не делать то 10А будет выше чем 8А.
В свете такой формулировки, и при условии, что число на первой позиции всегда есть, и что сама строка точно не короче двух символов, можно сортировать примерно по такому выражению:
SQL
1
ORDER BY iif(SUBSTRING(FIELD1 FROM 2 FOR 1) BETWEEN '0' AND '9', FIELD1, '0' || FIELD1)
т.е. к столбцу (де-факто выражению из одного столбца) прибавляется '0', если второй символ в строке не цифровой
1
0 / 0 / 0
Регистрация: 19.05.2011
Сообщений: 89
27.07.2012, 16:14  [ТС] 4
arni, огромное спасибо, пока работает, но все же это не чистое решение.

Пока Вы не подсказали пытался написать udf.

Что удивительно тестирую на дельфе все работает, компилирую и подключаю в firebird возвращает одни нули.

Вот что я написал на дельфи:

Delphi
1
2
3
4
5
6
7
8
function ValX(CString: PChar): Integer; cdecl; export;
var
 I, Code: Integer;
begin
  Val(StrPas(CString), I, Code);
 
  Result := I;
end;
так я ее объявил в firebird:
Oracle 11 SQL
1
2
3
4
DECLARE EXTERNAL FUNCTION VAL
    VARCHAR(256)
RETURNS INTEGER BY VALUE
ENTRY_POINT 'ValX' MODULE_NAME 'UDFDemo';
Как тестировал в дельфи:

Создал форму, на нее бросил Edit, Button и Label.

Повесил событие на нажатие кнопки, в едит ввожу данные, нажимаю на кнопку и в лабл виже результат который ожидаю.

А как только использую в firebird получаю одни нули????
0
912 / 877 / 62
Регистрация: 06.01.2010
Сообщений: 2,367
Записей в блоге: 6
27.07.2012, 16:45 5
vso, не, в udf я полный 0.
Вот если напишешь, почему не чистое решение, и какие из посылок могут быть нарушены (и как именно нарушены), то могу попробовать доработать SQL
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
28.07.2012, 11:18 6
arni, а similar to здесь нельзя попробовать?
0
912 / 877 / 62
Регистрация: 06.01.2010
Сообщений: 2,367
Записей в блоге: 6
29.07.2012, 12:33 7
SAMZ, надо сначала выудить у ТС всю правду о том, как формируется значение строки, на каких позициях что может стоять (а может и не стоять). Вобщем пока мало информации.
0
0 / 0 / 0
Регистрация: 19.05.2011
Сообщений: 89
30.07.2012, 09:11  [ТС] 8
Цитата Сообщение от arni Посмотреть сообщение
SAMZ, надо сначала выудить у ТС всю правду о том, как формируется значение строки, на каких позициях что может стоять (а может и не стоять). Вобщем пока мало информации.
Информация пока (почему пока? потому что в нашей работе постоянно возникаю новые вводные) хранится в таком виде, например: 4BKS00GE021.2A или 4BKS00GE021.10A или 4BKS00GE021.2/3 или 4BKS00GE021.6/9
это несколько вариантов, описывающие основной принцип в каком виде хранится информация в этом поле. Причем до точки закодировано устройство, а после точки место которое в нем используется. Соответственно надо сортировать места в пределах одного устройства в порядке возрастания. Поэтому я в первом представлении делаю так:

T-SQL
1
RIGHT(Dv."ПИТАНИЕ", IIF(Dv."ПИТАНИЕ" is NULL, null, CHAR_LENGTH(Dv."ПИТАНИЕ") - Position('.' IN Dv."ПИТАНИЕ"))) as "ПИТАНИЕ"
в следующем результирующем представлении делаю так, как подсказал arni:

T-SQL
1
IIF(SUBSTRING(Vt."ПИТАНИЕ" FROM 2 FOR 1) BETWEEN '0' AND '9', Vt."ПИТАНИЕ", '0' || Vt."ПИТАНИЕ") AS GROUP2
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
30.07.2012, 09:34 9
Цитата Сообщение от vso Посмотреть сообщение
Причем до точки закодировано устройство, а после точки место которое в нем используется
ИМХО, конечно, но так бы делать никогда не стал. Устройство кодировал бы отдельно, место отдельно. Если во внешнем представлении надо организовать код <УСТРОЙСТВО>.<MЕСТО>, то это можно сделать вычисляемым полем.
Ну, и использование кирилицы при именовании объектов БД считаю экзотикой
0
0 / 0 / 0
Регистрация: 19.05.2011
Сообщений: 89
30.07.2012, 10:01  [ТС] 10
Ну, и использование кирилицы при именовании объектов БД считаю экзотикой
Это наследство.

Устройство кодировал бы отдельно, место отдельно.
Это не отменяет необходимости сортировки -> выделения числа чтобы сортировать...
0
479 / 392 / 112
Регистрация: 24.04.2012
Сообщений: 1,632
Записей в блоге: 3
31.07.2012, 12:01 11
Может что-то типа такого подойдет
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
EXECUTE block (text VARCHAR(256) = :text)
  RETURNS (chislo INTEGER)/*, chislo_var varchar(10), pos smallint)*/
AS
DECLARE variable pos SMALLINT;
DECLARE variable chislo_var VARCHAR(10);
BEGIN
  pos = POSITION('.' IN text) + 1;
  while (pos < CHAR_LENGTH(text)) do
  BEGIN
    IF(SUBSTRING(text FROM pos FOR 1) BETWEEN '0' AND '9') THEN
      chislo_var = COALESCE(chislo_var,'') || SUBSTRING(text FROM pos FOR 1);
    pos = pos + 1;
  END
  chislo = CAST(chislo_var AS INTEGER);
  suspend;
END;
Добавлено через 6 часов 22 минуты
если решил проблему отпишись как сделал.
1
0 / 0 / 0
Регистрация: 19.05.2011
Сообщений: 89
31.07.2012, 16:09  [ТС] 12
Bit_Man, т.к. сроки всегда горят и хоть медленно но работает я использую вариант arni. Но как только сдадим документацию, планирую все же добить udf и испробовать твой вариант.
А возможно даже подрехтую базу, разделю на две части относительно точки и заставлю сразу вносить 01, 02 и т.д.
0
31.07.2012, 16:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.07.2012, 16:09
Помогаю со студенческими работами здесь

Выделить число из строки
Есть строка типа string; string s = &quot;search 9&quot;, как выделить число из этой строки и приравнять его...

Выделить из строки число
Дано: id=212313123312124 Как взять отсюда только 212313123312124 и записать в переменную? var ID...

Выделить число из вектора
Здравствуйте)имеется вектор A.Как в матлабе выделить максимальное число из этого вектора которое...

Выделить из строки число
Всем привет! Есть строка: Total transferred file size: 748190 bytes нужно в переменную...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru