Страница 1 из 1
Позиция символа в строке
Добавлено: 06 апр 2007, 11:26
Akella
В хранимке использую конструкцию вида
вот вместо многоточия хотелось бы использовать что-то вида
Pos('.', PARAM1)-1 (из Delphi)
т.е. определить номер позиции точки.
Другими словами: в процедуру передаю строку вида "39.45.47.129" или "9.154.1280.1569", процедура должна вернуть всё, что ДО первой точки, т.е. "39" или соотвественно "9".
Как реализовать на PSQL функцию POS? Или в стандартных UDF есть что-то подобное. Я прекрасно понимаю, что можно решить проблему с пом. своей собственной UDF, но подумал, что в Firebird всё-таки должна быть реализована вроде бы такая маленькая, но нужная функция, как POS. поиск по форуму не помог.
Заранее благодарен.
Добавлено: 06 апр 2007, 11:37
kdv
Или в стандартных UDF есть что-то подобное.
Или. Или в нестандартных.
поиск по форуму не помог.
вот еще, я на форум буду класть перечень функций fbudf, rfunc и так далее? Такого перечня и на сайте нет.
Добавлено: 06 апр 2007, 11:49
Akella
т.е. средствами стандартных UDF (поставляемых с FB) я такого не реализую?
Добавлено: 06 апр 2007, 12:00
WildSery
Библиотека rFunc функция strpos.
Но можно и обойтись PSQL. (синтаксис FB2)
Код: Выделить всё
CREATE PROCEDURE POS(
STR VARCHAR(100),
STR1 VARCHAR(100))
RETURNS (
P INTEGER)
AS
declare variable len_str integer;
declare variable len_str1 integer;
begin
p = 0; if (str is null) then exit;
len_str = char_length(str);
len_str1 = char_length(str1);
while (p <= len_str - len_str1) do begin
p = p+1;
if (substring(str from (:p) for len_str1) = str1) then exit;
end
p = 0;
end
Изменено: Оптимизировал процедуру по быстродействию
Добавлено: 06 апр 2007, 12:09
Akella
Спасибище, Друг

Добавлено: 06 апр 2007, 12:37
Akella
Немного переделав получил
Код: Выделить всё
CREATE PROCEDURE POS (
str varchar(100),
sub_str varchar(100))
returns (
p integer)
as
begin
p = 0;
if (str is null) then exit;
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;
end
Добавлено: 06 апр 2007, 12:48
WildSery
Akella писал(а):Немного переделав получил
Если тебе нужна селективная процедура, то SUSPEND нужно вставлять ещё в два места.
Посмотри ещё раз мой пост, я немного оптимизировал.
Добавлено: 06 апр 2007, 13:34
Akella
Я понял, ещё после p = 0;
но ты не поставил suspend и после исправления своего сообщения, так и надо? Или почему ты не поставил suspend?
Добавлено: 06 апр 2007, 15:01
WildSery
Ещё и перед EXIT в проверке на NULL, иначе процедура не вернёт значение.
У меня это "неселективная" процедура, из неё нельзя сделать SELECT * FROM POS(...);
Она вызывается EXECUTE PROCEDURE POS(...) RETURNING_VALUES P; для возврата значения в переменную P