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$';

Демо здесь.

Другие вопросы по тегам