检查查询返回的任何行是否包含在字符串中的最佳方法?

时间:2017-03-22 01:15:50

标签: c++ mysql

我实现了一个名称过滤器,其中有一个表" 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。

1 个答案:

答案 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