Форум программистов, компьютерный форум, киберфорум
Firebird/InterBase
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 03.04.2015
Сообщений: 8
1

Разбиение строки в FireBird - Firebird/InterBase

07.09.2017, 16:00. Просмотров 2972. Ответов 2

Продолжая тему отсюда: Разбиение строки в FireBird
Есть поле типа VARCHAR, в котором хранятся данные вида 10,20,30,40,50 и т.п. Нужно получить эти значения в виде таблице, т.е. в столбик. По сути, нужно разбить строку, имея возможность указать разделитель. Как решить такую задачу в FireBird? Нужно написать процедуру, функцию? Буду очень благодарен за примеры.

ОГРОМНОЕ СПАСИБО Mr. T ЗА КОД!!!
SQL
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
CREATE PROCEDURE EXPLODE (
    SEPARATOR VARCHAR(1),
    STRING VARCHAR(500))
RETURNS (
    POS INTEGER,
    PART_OF_THE_STRING VARCHAR(100))
AS
DECLARE variable I INTEGER;
DECLARE variable PART_OF_THE_STRING_TMP VARCHAR(100);
BEGIN
  i = 0;
  part_of_the_string_tmp = "";
  pos = 0;
  part_of_the_string = "";
  WHILE (:i < strlen (:string)) DO
    BEGIN
      i = :i + 1;
      part_of_the_string_tmp = SUBSTR (:string, :i, :i + strlen (:separator) - 1);
      IF (:part_of_the_string_tmp = :separator) THEN
        BEGIN
          pos = :pos + 1;
          suspend;
          part_of_the_string = "";
        END
      ELSE
        BEGIN
          part_of_the_string = :part_of_the_string || :part_of_the_string_tmp;
        END
    END
END
Данный код очень помог, но есть одно НО ...
При передаче строки вида: "10,20,30,40,50"
С разделителем ","
Процедура выводит результат:
----------------
| pos | string |
----------------
| 1 | 10 |
| 2 | 20 |
| 3 | 30 |
| 4 | 40 |

Может кто знает что подпилить в коде, чтобы выводило и оставшуюся часть строки (т.е. число 50)
Огромное спасибо за помощь!!!

Добавлено через 1 час 27 минут
Если передавать строку и в конце ставить разделитель: "10,20,30,40,50,"
то процедура выводит правильный результат:
----------------
| pos | string |
----------------
| 1 | 10 |
| 2 | 20 |
| 3 | 30 |
| 4 | 40 |
| 5 | 50 |
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.09.2017, 16:00
Ответы с готовыми решениями:

Разбиение строки в FireBird
Здравствуйте, есть поле типа VARCHAR, в котором хранятся данные вида 10,20,30,40,50 и т.п. Нужно...

Insert в Firebird/InterBase
Поддерживается ли сабж для множества строк? Что-то типа: INSERT INTO bill (BILL_CUST, BILL_SUMM,...

Firebird конфликт с interbase
Добрый день. вот такая незадача... ранее уставновила interbase, затем удалила и забыла про него....

InterBase не видит созданную БД в Firebird
InterBase невидит созданную БД в Firebird, что можно сделать?

2
458 / 379 / 103
Регистрация: 24.04.2012
Сообщений: 1,484
Записей в блоге: 3
08.09.2017, 03:39 2
Сам как то писал на SQL, а на UDF мозгов не хватило
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE OR ALTER PROCEDURE NOTLIST (
    TEXT D_BLOBTEXT,
    POSIX D_VARCHAR_10)
RETURNS (
    RESULT D_BLOBTEXT)
AS
DECLARE variable POS INTEGER;
BEGIN
  IF (text IS NULL OR CHAR_LENGTH(TRIM(text)) = 0) THEN
    BEGIN
      suspend; exit;
    END
  pos = POSITION(posix IN text);
  while (pos != 0) do
    BEGIN
        RESULT = SUBSTRING(text FROM 1 FOR pos - 1);
        text = SUBSTRING(text FROM pos + CHAR_LENGTH(posix) FOR CHAR_LENGTH(text) - CHAR_LENGTH(RESULT));
        --text = OVERLAY(text PLACING '' FROM 1 FOR char_length(result || posix));
        pos = POSITION(posix IN text);
        suspend;
    END
  RESULT = text;
  IF (CHAR_LENGTH(RESULT) > 0) THEN suspend;
END
Добавлено через 58 секунд
SQL
1
2
CREATE DOMAIN D_BLOBTEXT AS 
BLOB SUB_TYPE 1 SEGMENT SIZE 80 CHARACTER SET WIN1251
SQL
1
2
3
CREATE DOMAIN D_VARCHAR_10 AS 
VARCHAR(10) CHARACTER SET WIN1251 
COLLATE PXW_CYRL
0
0 / 0 / 0
Регистрация: 03.04.2015
Сообщений: 8
08.09.2017, 08:25  [ТС] 3
Спасибо за помощь Bit_Man!
Но пока обошелся (хотя может это и не очень) простым добавлением в конец входной строки разделителя
SQL
1
string = string || separator;
Пока все работает
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.09.2017, 08:25

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Что лучше: Interbase или Firebird?
привет! подскажите что лучше все таки для написания клиент-сервера с передачей данных через...

Как базу от InterBase с ODS 11.2 прицепить к FireBird?
Доброго времени суток. Проблема следующая: Есть программа (без исходников) для работы с...

Как написать запрос на Firebird, Interbase 2009
В бд есть таблицы: Income-накладные прихода: Income_id,Partn_id, Goods_id, Price, Qty,...

Firebird и Interbase не отображаются в окне Свойства канала (связи)
я установила на комп Firebird и IBExpert, но при установки связи с компонентом ADOConnection или...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.