私は、 "filter"という単一の列を持つテーブル "name_filter"に不適切と見なされる単語が埋め込まれた名前フィルタを実装しています。名前が要求されると、このテーブル内の名前が*row*
と一致する要求された名前に含まれているかどうかを確認したいのですが、クエリから返された行が文字列内に含まれているかどうかを確認する最も効果的な方法は?
クエリは次のとおりです。
SELECT filter
FROM name_filter
私は現在、列全体を引っ張って、その後チェック一つずつstd::string
のfind()
方法を使用して行っております:
// 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
としたいと思います。実際の質問の一部ではありませんが、ブラウニーはLIKE
の代わりにREGEX
として動作する代替提案を指しています。
REGEXの場合は、^ bra $のような短い名前を許可しないことになりますが、それでもCobraは許可されます。