@generate
...

Как сделать поиск по регулярному выражению SQL?

SELECT * FROM `post` WHERE `description` REGEXP 'itemid=34543[^\d]*'

Хочу найти такое значение itemid=34543 после этого всё что угодно кроме цифр но почему то выдает не то, подскажите как правильно использовать все кроме в sql
  • Вопрос задан
  • 103 просмотра
Пригласить эксперта
Ответы на вопрос 2
ThunderCat
@ThunderCat
{PHP, MySql, HTML, JS, CSS} developer
TL;DR: переписывайте базу пока не поздно. Приводите в 3 нормальную форму и будет вам "щастие".

1) Хранение данных по которым идет поиск в таком виде - это сразу расписаться в своей проф. непригодности, никому не показывайте эту стыдобу.

2) Разнесите данные нормально по таблицам, не думайте что вы прям "выкрутились" захерачив все в строку и у вас все в шоколаде. Нифига, теперь у вас по этому полю будут кошмарно тормозные запросы, так как самые медленные операции - это лайк и регексп. Тем более по полю с переменной длинной и без нормальных индексов. И все это вместо суперскоростного индекса по интежер полю.

3) Кроме остальных проблем - теперь вместо просто апдейта поля вам сначала надо его считать, распарсить и только потом обновлять, чтобы не потерять информацию, то есть вы часть стандартной логики бд переносите в код, где ему не место.

4) ну и на одну из проблем вы уже напоролись - поиск по нечетким данным даст нечеткий результат.
Ответ написан
@Miron11
Пишу sql 20 лет. Срок :)
У Вас есть 2 основных подхода
1. через 2 выражения пользуясь операторами перечисленными здесь
https://dev.mysql.com/doc/refman/8.0/en/regexp.html
Возможно не всеми в любой комбинации, но существенно то, что один оператор должен найти часть последовательности символов, которые должны ответить, например
SELECT *
FROM `post`
WHERE
-- 1-е выражение
`description` LIKE 'itemid=34543%'
-- 2-е выражение
AND
`description` NOT RLIKE 'itemid=34543[0-9]+'

2. через 1 регулярное выражение, очень похожее на то, которое Вы предложили, но видимо с \ ( backslash ) символом проведенным дважды, на той же странице объясняется почему: "Because MySQL uses the C escape syntax in strings (for example, \n to represent the newline character), you must double any \ that you use in your expr and pat arguments."
Если по той или иной причине выражение артачится, наверное можно воспользоваться выражением на один символ длиннее, для выражения цифр [^0-9]
Ну и наверное надо воспользоваться плюсом, а не звездочкой справа [^0-9]+, иначе эта часть становится не обязательной, и запрос может выбрать, например, значение 'itemid=34543'
---
Всего хорошего!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы