Подобные вещи возможны в Firebird, но они немного запутаны. Возможно, вы захотите сделать это на выбранном вами языке программирования.
В Firebird вы можете использовать POSITION
, чтобы найти маркер начала и конца, а затем использовать SUBSTRING
и объединение для перестроения строки.
Используя эти функции, вы можете создать свою собственную PSQL функцию :
create or alter function replace_tags(input_value blob sub_type text) returns blob sub_type text
as
declare temp blob sub_type text = '';
declare start_tag char(7) = '{START ';
declare end_tag char(1) = '}';
declare start_replacement char(2) = '(#';
declare end_replacement char(2) = '#)';
declare search_start integer = 1;
declare start_position integer;
declare end_position integer;
begin
while (true) do
begin
-- Search for occurrence of start-tag '{START '
start_position = position(start_tag, input_value, search_start);
if (start_position = 0) then leave;
-- Search for occurrence of end-tag '}' after start-tag
end_position = position(end_tag, input_value, start_position + 7);
if (end_position = 0) then leave;
temp = temp
-- Add text before start-tag (and after previous end-tag found)
|| substring(input_value from search_start for start_position - search_start)
-- Add replacement start-tag
|| start_replacement
-- Add text between start-tag and end-tag
|| substring(input_value from start_position + 7 for end_position - start_position - 7)
-- Add replacement end-tag
|| end_replacement;
-- Setup for next search or finding remainder of string
search_start = end_position + 1;
end
-- Add remainder of the string
temp = temp || substring(input_value from search_start);
return temp;
end
Я не сделал полностью протестируйте эту функцию, поэтому обязательно проверьте ее самостоятельно.
Пример использования:
select replace_tags('This is an {START example a=b}. The {duck} is big.')
from rdb$database
Вывод:
This is an (#example a=b#). The {duck} is big.