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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определить номер позиции символа, типа POS() 
:(
    Опции темы
Akella
Дата 6.4.2007, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Firebird 2.0.

Нужно в хранимой процедуре узнать номер позиции символа в строковой переменной.
Например, есть строка вида "39.45.125.127",  или "5.6.10.1258", мне нужно из этой строки получить символы ДО первой точки., т.е. из "39.45.125.127" получить "39".
В Delphi это так бы выглядело - if Pos(ADelim, AText) > 0 then result := Copy(AText, 1, Pos(ADelim,AText)-1);
А как это реализовать в Firebird 2.0??? smile 
PM MAIL   Вверх
Akella
Дата 6.4.2007, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Так подсказали сделать
Код

CREATE PROCEDURE POS(
    STR VARCHAR(100),
    STR1 VARCHAR(100))
RETURNS (
    P INTEGER)
AS
begin
  p = 0;
  if (str is null) then exit;
  while (char_length(str) >= char_length(str1)) do begin
    p = p+1;
    if (substring(str from 1 for char_length(str1)) = str1) then exit;
    str = substring(str from 2 for char_length(str));
  end
  p = 0;
end

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


Творец
****


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

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



немного переделали:

Код

CREATE PROCEDURE POS(
    STR VARCHAR(100),
    STR1 VARCHAR(100))
RETURNS (
    P INTEGER)
AS
begin
  p = 0;
  if (str is null) then exit;
  while (char_length(str) >= char_length(str1)) do begin
    p = p+1;
    if (substring(str from 1 for char_length(str1)) = str1) then begin
      suspend;
      exit;
    end
    str = substring(str from 2 for char_length(str));
  end
  p = 0;
end

PM MAIL   Вверх
Alex
Дата 6.4.2007, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 7
Всего: 162



Код

CREATE PROCEDURE POS(
    STR VARCHAR(100),
    STR1 VARCHAR(100))
RETURNS (
    P INTEGER)
AS
begin
  p = 0;
  if (str is null) then exit;
  while (char_length(str) >= char_length(str1)) do begin
    p = p+1;
    if (substring(str from 1 for char_length(str1)) = str1) then begin
      suspend;
      exit;
    end
    str = substring(str from 2 for char_length(str));
  end
  p = 0;
end



--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Akella
Дата 6.4.2007, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



ещё в двух местах забыли suspend

Код

CREATE PROCEDURE POS (
    str varchar(100),
    sub_str varchar(100))
returns (
    p integer)
as
begin
  p = 0;
  if ((str is null) or (SUB_STR is null))  then begin
    suspend;
    exit;
  end
  while (char_length(str) >= char_length(sub_str)) do begin
    p = p+1;

    if (substring(str from 1 for char_length(sub_str)) = sub_str) then begin
      suspend;
      exit;
    end
    str = substring(str from 2 for char_length(str));
  end
  p = 0;
  suspend;
end

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


Творец
****


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

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



ещё один вариант (немного оптимизированный)

Код

CREATE PROCEDURE POS( STR VARCHAR(100),  SUB_STR VARCHAR(100))
RETURNS (P INTEGER)
AS
declare variable len_str integer;
declare variable len_str1 integer;
begin
  p = 0;
   if ((str is null) or (SUB_STR is null))  then begin
    suspend;
    exit;
  end
  len_str = char_length(str);
  len_str1 = char_length(SUB_STR);
  while (p <= len_str - len_str1) do begin
    p = p+1;
    if (substring(str from (:p) for len_SUB_STR) = SUB_STR) then begin 
     suspend;
     exit;
    end;
  end
  p = 0;
  suspend;
end


Это сообщение отредактировал(а) Akella - 6.4.2007, 13:00
PM MAIL   Вверх
Akella
Дата 14.11.2008, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



вот ещё вариант:
Код

 Position of substring function in SP
This function returns index of the first character in a specified substring (SubStr parameter) that occurs in a given string (Str).

CREATE PROCEDURE Pos (SubStr VARCHAR(100), Str VARCHAR(100))
  RETURNS (Pos INTEGER) AS
DECLARE VARIABLE SubStr2 VARCHAR(201); /* 1 + SubStr-lenght + Str-length */
DECLARE VARIABLE Tmp VARCHAR(100);
BEGIN
  IF (SubStr IS NULL OR Str IS NULL)
  THEN BEGIN Pos = NULL; EXIT; END

  SubStr2 = SubStr || '%';
  Tmp = '';
  Pos = 1;
  WHILE (Str NOT LIKE SubStr2 AND Str NOT LIKE Tmp) DO BEGIN
    SubStr2 = '_' || SubStr2;
    Tmp = Tmp || '_';
    Pos = Pos + 1;
  END

  IF (Str LIKE Tmp) THEN Pos = 0;
END


взято с 
http://www.volny.cz/iprenosil/interbase/ip...code_string.htm
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

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

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

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

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

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

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


 




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


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

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