MYSQL: поиск эквивалента ригеля Perl "regex" = ~ s / e / i / g => в MySQL Select - PullRequest
5 голосов
/ 23 августа 2009

Могу ли я сопоставить и заменить текстовый шаблон в MYSQL?


EDIT На данный момент похоже, что ответ: Не может быть сделано, так как вы не можете захватить то, что соответствует (из Эрика ответ / комментарии). Сейчас я рассмотрю добавление справочной таблицы.


Упрощенный пример:

Таблица MySQL Coleridge содержит много строк, таких как:

text
------------------------------------
In_Xanadu_did_Kubla_Khan
A_stately_pleasure_dome_decree
Where_Alph_the_sacred_river_ran
Through_caverns_measureless_to_man
Down_to_a_sunless_sea

Есть ли способ выразить выбор

ВЫБРАТЬ текст = ~ s / [^ _] + _ (. *) _ [^ _] + $ / \ 1 / в качестве замены FROM Coleridge

и получите

replaced
________________________
Xanadu_did_Kubla
stately_pleasure_dome
Alph_the_sacred_river
caverns_measureless_to
to_a_s

Обратите внимание:

  1. Регулярное выражение s /// I при условии гораздо менее сложным чем то, что содержит БД в реальном мире
  2. К сожалению, я не могу нормализовать БД ..

Ответы [ 2 ]

5 голосов
/ 23 августа 2009

В MySQL нет способа заменить что-либо регулярным выражением. Вы можете сопоставить в MySQL на основе RegEx (regexp), но это не возвращает то, какая часть соответствует, только весь столбец, который есть. Но вы можете использовать replace примерно так:

select replace(col, 'e', 'i') from tbl

Это вернет regex как rigix.

Что касается вашего конкретного примера, вам придется использовать комбинацию locate и substring:

select 
    substring(col
        , locate('_', col)+1
        , locate('_', reverse(col))-(len(col)-locate('_', col)-1)) 
from tbl

Общее правило для обработки / обработки строк на уровне базы данных: не усложняйте. СУРБД думают в наборах, и именно там они сияют. Вытягивать отдельные струнные манипуляции не в их сладком месте. Таким образом, ни одна СУБД не имеет действительно зрелых функций обработки строк (и, разумеется, между ними нет никакой согласованности). Если ваше регулярное выражение достаточно сложное, вы, скорее всего, захотите просто обработать его на уровне представления / приложения, а не в базе данных.

2 голосов
/ 23 августа 2009

Нет, вы не можете. MySQL поддерживает регулярные выражения только для сопоставления (RLIKE), но не для замены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...