Есть некоторое(довольно большое) количество данных в базе и есть простенькая программка(Web страница), которая осуществляет поиск в соответствии с заданными критериями и показывает результаты. Стоит задача разрешить пользователю использовать регулярные выражения (т.е. вводить например: ищи ИМЯ=(О|Ко)ля). Проблема состоит в том, что стандартный SQL регулярные выражения не поддерживает. А значит придется запрашивать из базы сначала все данные и проверять их вручную на соответствие критерию. С другой стороны SQL понимает wildcards: '_' - один, '%' - 0 или больше знаков. Поэтому есть идея выразить данное регулярное выражение (насколько возможно) с помощью wildcards, передать его SQL, и только потом (если потребуется) проверять вручную результаты. Которых уже будет значительно меньше. Например ИМЯ=(О|Ко)ля) преобразуется в (ИМЯ=Коля OR ИМЯ=Оля), здесь даже вручную дорабатывать не придется. Для + и * надо будет задавать максимальную глубину "раскрутки" (например глубина 3: ИМЯ=аа*б => (ИМЯ=а%б OR ИМЯ=аа%б OR ИМЯ=ааа%б)), но это уже детали. Чтобы не делать дурную работу вопрос: может кто-то уже писал что-то похожее или знает где взять(обязательно с исходниками)? Если нет, придется самому писать, ничего сложного но жалко времени. Ну и общие соображения конечно приветствуются, может есть более простое решение.
А база какая? Просто у многих серверов есть собственные способы обработки регулярных выражений - у кого-то родные, у кого-то подключаемые.
bsl_zcs База mySQL и у нее действительно есть свои регулярные выражения. Беда в том, что я работаю с mySQL не напрямую, а через промежуточный слой Hibernate. Hibernate SQL(HQL) же поддерживает к сожалению только выражения из ANSI SQL 92, да и то не все.
Да, LIKE конечно поддерживает, то есть пример из первого поста будет на самом деле (ИМЯ LIKE 'а%б' OR ИМЯ LIKE 'аа%б' OR ИМЯ LIKE 'ааа%б') Сократил для наглядности, прошу прощения, если ввел в заблуждение. Но смысла это не меняет.
Stiver Насколько я понимаю, специально для этого у хибернейта предназначены native sql queries. http://www.hibernate.org/hib_docs/v3/reference/en/html/querysql.html
bsl_zcs Правильно, но если поменяется база данных(а так скорее всего и будет, на DB2 или SQL Server), то придется все эти queries писать заново. Смысл Hibernate как раз и состоит в том, чтобы быть как можно более независимым от конкретной базы данных. Я только что с большим трудом избавился от mySQL-евской concat() и вносить новую эависимость не очень хочется. Да и не даст мне никто
Stiver Почему не меняет смысла ? Ведь можно же like "*аша" ("Наташа") ? Только для сайбэйзу нужно использовать вместо * что-то иное...