我实现了一个名称过滤器,其中有一个表" name_filter"用一列"过滤"填充了被认为不合适的单词。请求名称时,我想使用*row*
匹配检查此表中的任何名称是否包含在所请求的名称中。
查询是:
SELECT filter
FROM name_filter
我目前正在拉动整个列,然后使用find()
的{{1}}方法逐个执行检查:
std::string
一位朋友建议了以下查询,但不确定是否正确。它看起来很有效,但我们之前没有人像这样做过这样的查询:
// Check all names in the filter table and match if the input name contains the
// value in one of the rows
for (int i = 0; i < affectedRows; ++i) {
MYSQL_ROW row = mysql_fetch_row(result);
// No more rows
if (!row)
break;
// Content matches name filter
if (name.find(row[0]) != std::string::npos) {
mysql_free_result(result);
return false;
}
}
这适用于所有情况吗?请提供有关此查询的原因说明。
理想情况下,我希望比较为SELECT filter
FROM name_filter
WHERE 'name'
LIKE concat('%',filter,'%')
LIMIT 1
。虽然不是实际问题的一部分,但布朗尼指出了另一个提案,该提案可用作REGEX
而不是REGEX
。
REGEX的情况是禁止像^ bra $这样的短名称,但仍允许Cobra。
答案 0 :(得分:0)
是的,根据documentation,这正是您想要做的事情:
查找包含w:
的名称
mysql> SELECT * FROM pet WHERE name LIKE '%w%';
但是,与c++
- 代码:
null
(不是字符串'null'
,但null
中的c++
指针,like
},c++
将找不到它,而您的null
代码将不允许它(因为''
已转换为空字符串_
)。%
或string.find
,则它们将被解释为&#34;一个字符&#34;和&#34;任意数量的字符&#34;,而z%o
不这样做。因此,如果您使用Zhro
过滤器,则会禁止使用名称%z%o%
,因为它会匹配%bra%
。 您当然可以使用最后一个点,而不是将部分单词添加到列表中,添加整个搜索表达式。如果你是将SELECT * FROM pet WHERE 'name' LIKE filter;
添加到您的过滤列表
bra
然后会找到包含bra%
的任何字词。如果您要将bra
添加到您的过滤列表,则会禁止brainiac
(和Cobra
),但不会禁止bra
。如果您添加bra
,则会禁止Cobra
,但brainiac
和%
都不会。在您习惯之前,这个列表可能有点难以维护,但会给您更多的灵活性。
您可以使用regpatterns(请注意缺少的mysql> SELECT * FROM pet WHERE name REGEXP 'w';
):
要查找包含w的名称,请使用以下查询:
^
Regular expressions支持常见的运营商,例如$
和like
。虽然正则表达式支持的运算符多于like
,但这两个运算符也可以使用%
表示,而不使用前导或尾随^
。如果您的过滤词包含正则表达式运算符(例如.
或bra
),那么这些也将被解释 - 如果您将过滤器作为正则表达式输入,则可以再次使用它们。
要阻止完整的单词Cobra
,但仍允许sexy_bra
(还有SELECT * FROM name_filter WHERE 'name' REGEXP '^bra$';
SELECT * FROM name_filter WHERE 'name' LIKE 'bra';
SELECT * FROM name_filter WHERE 'name' = 'bra';
),您可以使用以下任何一项:
SELECT * FROM name_filter WHERE 'Zhro' = 'z%o';
最后一个不会解释运算符,因此true
不会是Alimento
。