Symfony - addHaving - 连接 + 正则表达式
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'
查询生成器
$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() 函数,但无法创建由于无法分配到的错误抛出。
对于 MySQL 的查询,我似乎可以使用以下 2 种形式中的任何一种:
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$';
查看演示 here
我只是在想问题可能出在 CHAR 列上
因此,例如,一列 CHAR(5)
上的 FOO<space><space>
而不是 VARCHAR(5)
上的 FOO
。因此,在连接时你会得到类似于 FOO<space><space>BAR<space><space>
的东西,因此正则表达式会失败。
但是,对于 SQLFiddle,情况似乎并非如此。它似乎没有添加空格。参见 here。
无论如何,可能值得在您的应用程序上尝试一下:您使用的是字符还是变量?您能否尝试在列中添加 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$';
演示 here.
原始查询:
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'
查询生成器
$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() 函数,但无法创建由于无法分配到的错误抛出。
对于 MySQL 的查询,我似乎可以使用以下 2 种形式中的任何一种:
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$';
查看演示 here
我只是在想问题可能出在 CHAR 列上
因此,例如,一列 CHAR(5)
上的 FOO<space><space>
而不是 VARCHAR(5)
上的 FOO
。因此,在连接时你会得到类似于 FOO<space><space>BAR<space><space>
的东西,因此正则表达式会失败。
但是,对于 SQLFiddle,情况似乎并非如此。它似乎没有添加空格。参见 here。
无论如何,可能值得在您的应用程序上尝试一下:您使用的是字符还是变量?您能否尝试在列中添加 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$';
演示 here.