Регулярное выражение с исключением

Рейтинг: 0Ответов: 1Опубликовано: 20.10.2014

Доброго времени суток! Нужна помощь в написании регулярного выражения. В базе есть таблица chars с полями id, title, val, в которой хранятся значения val, например:

  1. |Хром матовый|Золото|
  2. |Антик|Хром|
  3. Квадратный
  4. Круглый

(Символ "|" не означает, что я пытался таблицу рисовать, этот символ относится к строке, которая хранится в поле val.)

Проблема в следующем: мне необходимо по запросу получить title, часть условия в запросе первоначально была такая:

WHERE val LIKE '%$value%'

Но в таком случае, если $value='Хром', то подходят записи с val равном как |Антик|Хром| (что правильно), так и |Хром матовый|Золото| (что неправильно).
Заменил LIKE на RLIKE, написал такое выражение:

$rlike='('.$value.'[^[:space:]])';
WHERE val RLIKE '$rlike'

Получилось, что при $value='Хром' всё идеально, т.к. поля с таким значением содержат несколько так сказать наборов переменных (разделены "|"), но когда, например, $value='Круглый', он ничего не находит. (

Помогите написать правильную регулярку!

Ответы

▲ 1

Так?

where '|'+val+'|' rlike '|$value|'

А можете рассказать, зачем вам такая структура данных, с которой вы работать не можете/не умеете?

Обновление

Все просто. Ваша структура находится не в первой нормальной форме. И недостатки проектирования вы пытаетесь оправдать каким-то регулярками. Очевидно правильный вариант - декомпозиция, после которой написать запрос не составит никакого труда. И вопрос бы вы не задавали, разумеется.

Да, естественно код в ответе работать не будет, т.к. формат регулярных выражений для mysql свой. Это был псевдокод.

Вот вам фидл с работающим запросом.

where CONCAT('|',val,'|') rlike '.*[[.vertical-line.]]$value[[.vertical-line.]].*';