Symfony - addHaving - concat + regexp
Необработанный запрос:
select firstfield, secondfield, phone_number, thirdfield
from table
having CONCAT(firstfield, ' ', secondfield, ' ', thirdfield, ' ', fourthfield) regexp 'value'
and CONCAT(firstfield, ' ', secondfield, ' ', thirdfield, ' ', fourthfield) regexp 'value2'
and CONCAT(firstfield, ' ', secondfield, ' ', thirdfield, ' ', fourthfield) regexp 'value3'
and CONCAT(firstfield, ' ', secondfield, ' ', thirdfield, ' ', fourthfield) regexp 'value4'
QueryBuilder
$qb->select(
'firstfield',
'secondfield',
'thirdfield',
'fourthfield',
)->from(Table, 'u');
$queryHaving = "CONCAT(firstfield, ' ', secondfield, ' ', thirdfield, ' ', fourthfield) regexp 'value'";
$qb->andhaving($queryHaving);
$queryHaving = "CONCAT(firstfield, ' ', secondfield, ' ', thirdfield, ' ', fourthfield) regexp 'value2'";
$qb->andhaving($queryHaving);
Проблема:
Как собрать concat с регулярным выражением не как функцию? Попытка с использованием функции literal(), но невозможно создать из-за ошибок, которые невозможно назначить.
1 ответ
Мне кажется, что запрос работает для MySQL с любой из этих двух форм:
select *
from test
having concat(field1, field2) regexp '^[FB].*' and
concat(field1, field2) regexp 'o$';
select *
from test
where concat(field1, field2) regexp '^[FB].*' and
concat(field1, field2) regexp 'o$';
Посмотреть демо здесь
Я просто думаю о проблеме может быть с колонками CHAR
Так, например, один столбец будет иметь FOO<space><space>
на CHAR(5)
вместо FOO
в VARCHAR(5)
, Таким образом, при объединении у вас будет что-то похожее на FOO<space><space>BAR<space><space>
и, таким образом, регулярное выражение потерпит неудачу.
Тем не менее, с SQLFiddle это не так. Это, кажется, не добавляет пробелов. Смотрите здесь.
В любом случае, стоит попробовать в вашем приложении: используете ли вы символы или varchars? Не могли бы вы попробовать добавить trims
в столбцах вот так:
select *,concat(trim(field1), trim(field2))
from test
having concat(trim(field1), trim(field2)) regexp '^[FB].*' and
concat(trim(field1), trim(field2)) regexp 'o$';
select *,concat(trim(field1), trim(field2))
from test
where concat(trim(field1), trim(field2)) regexp '^[FB].*' and
concat(trim(field1), trim(field2)) regexp 'o$';
Демо здесь.