SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » Использование регульрного выражения в update запросе (Регулярные выражения в запросе update)
Использование регульрного выражения в update запросе [сообщение #107] Wed, 29 June 2022 14:31 Переход к следующему сообщению
RusMikle в настоящее время не в онлайне  RusMikle
Сообщений: 18
Зарегистрирован: June 2022
Junior Member
Всем доброго дня,

столкнулся проблемкой. Надо в update запросе заменить часть memo с использованием регулярного выражения. Посмотрел FB доку, есть SIMILAR TO и есть replace( и больше ничего не вижу Получается обломись, или слеп?
Хотелось бы что то вроде update ini set ini.bindata = RegReplace(ini.bindata, 'Left=[0-9]*', 'Left=1') where ....

FB3
Спасибо
Re: Использование регульрного выражения в update запросе [сообщение #109 является ответом на сообщение #107] Wed, 29 June 2022 14:43 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: June 2022
Senior Member
Действительно у нас нет REPLACE по регулярному выражению. Но помимо SIMILAR TO есть SUBSTRING которая умеет работать по регуляркам.
Сочетание SUBSTRING и REPLACE может решить вашу задачу
Re: Использование регульрного выражения в update запросе [сообщение #110 является ответом на сообщение #109] Wed, 29 June 2022 14:44 Переход к предыдущему сообщениюПереход к следующему сообщению
RusMikle в настоящее время не в онлайне  RusMikle
Сообщений: 18
Зарегистрирован: June 2022
Junior Member
спасибо, параллельно уже тут на пример наткнулся: https://www.firebirdforum.de/viewtopic.php?t=157
Re: Использование регульрного выражения в update запросе [сообщение #112 является ответом на сообщение #107] Wed, 29 June 2022 14:59 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: June 2022
Senior Member
EXECUTE BLOCK
RETURNS (
  OUT_TXT BLOB SUB_TYPE TEXT
)
AS
  DECLARE FUNCTION REPLACE_BY_REG (
    TXT BLOB SUB_TYPE TEXT,
    STR_SEARCH VARCHAR(150),
    STR_REP VARCHAR(150))
  RETURNS BLOB SUB_TYPE TEXT
  AS
  DECLARE F VARCHAR(150);
  BEGIN
    F = SUBSTRING(TXT SIMILAR '%#"' || S || '#"%' ESCAPE '#');
    RETURN REPLACE(TXT, F, R);
  END
BEGIN
  OUT_TXT = REPLACE_BY_REG(
'
RIGHT=345345
LEFT=34
TOP=11
',
  'LEFT=[0-9]*',
  'LEFT=1'
  );
  SUSPEND;
END
Небольшой пример. Минус тут в том что будет один дополнительный промежуточный блоб.
Re: Использование регульрного выражения в update запросе [сообщение #114 является ответом на сообщение #112] Wed, 29 June 2022 17:35 Переход к предыдущему сообщениюПереход к следующему сообщению
RusMikle в настоящее время не в онлайне  RusMikle
Сообщений: 18
Зарегистрирован: June 2022
Junior Member
если кому пригодится запрос получился такой:
update ini
SET ini.bindata =
Trim(Replace(ini.bindata,
SUBSTRING(CAST(ini.bindata as CHAR(:MDG)) SIMILAR '%#"Left=[0-9]+#"%' ESCAPE '#')
,'Left=1'))
where ..............'


происходит замена в тексте ......... Left=Число ..... на ........Left=1.......
не очень быстрый но в моём случае вполне по скорости приемлем.
Re: Использование регульрного выражения в update запросе [сообщение #128 является ответом на сообщение #114] Thu, 30 June 2022 15:49 Переход к предыдущему сообщению
RusMikle в настоящее время не в онлайне  RusMikle
Сообщений: 18
Зарегистрирован: June 2022
Junior Member
жалко сие чудо не работает в fb2.5.n
Хотя некоторые зачатки SIMILAR, согласно доке, уже присутствуют. Но не в Substring Sad
Предыдущая тема: Помогите с запросом
Следующая тема: Изменение COLLATION во всей базе
Переход к форуму:
  


Текущее время: Sun Dec 22 19:23:56 GMT+3 2024

Общее время, затраченное на создание страницы: 0.00875 секунд