MySQL / Красноречивое жадное регулярное выражение - PullRequest
3 голосов
/ 25 февраля 2020

Я пытаюсь запросить таблицу MySQL, используя Laravel ORM Eloquent (я думаю, это не имеет значения). У меня в таблице есть поле с именем quantitative, которое содержит JSON в формате [{name: 'a', value: 3}, {name: 'b', value: 4}].

Я хочу, чтобы пользователь мог запрашивать все записи, содержащие значения, которые он указал в любом порядке.

AllowedFilter::callback('quantitative', function (Builder $query, $value) {
    $quantitative = collect($value)->filter(function ($el) {
        return isset($el['value']);
    })->pluck('value')->map(function ($el) {
        return "(?=.*{$el})";
    })->implode('');

    $query->where('quantitative', 'regexp', "({$quantitative}).*");
}),

, который генерирует запрос (ниже) с использованием регулярного выражения (?=.*a)(?=.*b).*

SELECT count(*) as aggregate from `table` where `quantitative` regexp ((?=.*a)(?=.*b)).* (...)

Выдает следующую ошибку:

SQLSTATE [42000]: синтаксис ошибка или нарушение прав доступа: 1139 Ошибка 'операнд оператора повторения недействителен' от regexp

Regex сам по себе работает нормально, когда я проверяю его на regex101.com, проблема у меня заключается в том, что это не так действителен для MySQL синтаксиса. Есть ли способ заставить его работать или использовать другое регулярное выражение для выполнения sh задачи?

1 Ответ

0 голосов
/ 26 февраля 2020

Похоже, что любой из них будет работать:

LIKE '%a%b%'

REGEXP 'a.*b'

Пожалуйста, предоставьте краткий список строк, которые должны соответствовать, и короткий список, который должен не соответствовать .

Если вы пытаетесь найти вещи внутри строки JSON, я предлагаю либо

  • Не использовать JSON
  • Использовать JSON функции, если ваша версия MySQL достаточно новая.

REGEXP и LIKE слишком запутанны. Обратите внимание, что [{name: 'b', value: 4}] содержит как a, так и b.

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