Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Количество запятых в строке, узнать в хранимке 
V
    Опции темы
Akella
  Дата 26.3.2008, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Есть строковое поле, мне нужно узнать, сколько там запятых, как можно было бы подсчитать?
как можно "пробежаться" по строке средствами FB?

Всё это в хранимке, т.е. я хранимке даю ID, а она мне возаращает только количество запятых в поле.

Добавлено через 13 минут и 34 секунды
Вроде получилось
Код

CREATE OR ALTER PROCEDURE SP_GET_COMA_FROM_DATAS (
    in_id BIGINT)
RETURNS (
    res SMALLINT)
AS
DECLARE VARIABLE v_datas VARCHAR(1000) CHARACTER SET win1251;
DECLARE VARIABLE v_coma_count SMALLINT;
DECLARE VARIABLE v_chars INTEGER;
DECLARE VARIABLE v_i INTEGER;
DECLARE VARIABLE v_char VARCHAR(30) CHARACTER SET win1251;
begin
  V_COMA_COUNT = 0;
  for select tr.datas from treklama tr where tr.id = :in_id into :v_datas do begin
    V_CHARS = CHAR_LENGTH(v_datas);
    v_i = 0;
    WHILE (V_CHARS > 0) do begin
      v_i = v_i + 1;
      V_CHAR = SUBSTRING(v_datas from v_i for 1);
      if (V_CHAR = ',') then V_COMA_COUNT = V_COMA_COUNT + 1;
      V_CHARS = V_CHARS - 1;
    end--while
  end--for
  res = V_COMA_COUNT;
  suspend;
end

PM MAIL   Вверх
Akella
Дата 26.3.2008, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



думаю, что более оптимального метода нет
PM MAIL   Вверх
Deniz
Дата 27.3.2008, 06:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Цитата(Akella @  26.3.2008,  16:52 Найти цитируемый пост)
думаю, что более оптимального метода нет 
разве что пару переменных убрать.
v_coma_count, v_i не нужны.
Код

WHILE (V_CHARS > 0) do begin
      V_CHAR = SUBSTRING(v_datas from V_CHARS for 1);
      if (V_CHAR = ',') then res = res + 1;
      V_CHARS = V_CHARS - 1;
end--while

если treklama.id уникальный, то можно for select ... заменить на просто select ...
Код

select coalesce(tr.datas, '') from treklama tr where tr.id = :in_id into :v_datas;



--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
Дата 27.3.2008, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



СПАСИБО за оптимизацию smile 
+1
PM MAIL   Вверх
ksili
Дата 31.3.2008, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



и ещё непонятно, почему V_CHAR это VARCHAR(30), когда хватит и VARCHAR(1)


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Akella
Дата 31.3.2008, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



просто не захотел плодить ещё один домен smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0455 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.