2017-03-22 10 views
0

私は、 "filter"という単一の列を持つテーブル "name_filter"に不適切と見なされる単語が埋め込まれた名前フィルタを実装しています。名前が要求されると、このテーブル内の名前が*row*と一致する要求された名前に含まれているかどうかを確認したいのですが、クエリから返された行が文字列内に含まれているかどうかを確認する最も効果的な方法は?

クエリは次のとおりです。

SELECT filter 
FROM name_filter 

私は現在、列全体を引っ張って、その後チェック一つずつstd::stringfind()方法を使用して行っております:

// 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は許可されます。

答えて

0

はい、documentationによると、これは正確にあなたが何をしたいです:

mysql> SELECT * FROM pet WHERE name LIKE '%w%';

は、しかし、2つの微妙な違いがあります:

AW含む名前を検索するにあなたのc++とコード:

  • あなたのフィルタがnull(文字列ではありません'null'、しかしc++null -pointerのようなもの)が含まれている場合(nullは、空の文字列''にキャストされたように)あなたのc++コードがそれを許しませんが、likeは、それを見つけることができません。
  • フィルタに演算子_または%が含まれている場合、それらは "1文字"と "任意の文字数"として解釈されますが、string.findではそのように解釈されません。したがって、フィルタがz%oの場合、%z%o%と一致するため、Zhroという名前は使用できません。
  • もちろん、最後のポイントを使用して部分的な単語をリストに追加する代わりに、検索式全体を追加することもできます。例:

    SELECT * FROM pet WHERE 'name' LIKE filter; 
    

    が、その後braを含む任意の単語を見つけるでしょう、あなたのfilterlistに%bra%を追加します。フィルタリストにbra%を追加すると、bra(およびbrainiac)は禁止されますが、Cobraは禁止されません。 braを追加した場合、これはbraを禁止しますが、Cobraでもbrainiacでもありません。このリストは、慣れていない限り維持するのが少し難しいかもしれませんが、柔軟性が増します。

    あなたはregpatternsと同じことを行うことができます(行方不明%に注意してください):

    をAWを含む名前を検索するには、このクエリを使用します。

    mysql> SELECT * FROM pet WHERE name REGEXP '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'; 
    

    最後のものは、演算子をinterpreteないので、SELECT * FROM name_filter WHERE 'Zhro' = 'z%o';trueではありません。

    関連する問題