2011-02-07 5 views
0

私はSQLite Cインターフェイスを使ってアプリケーションを作成しています。私はセキュリティが気に入っているので、準備されたステートメントを使ってデータベースに問い合わせています。このようなクエリの1つでは、MATCHキーワードを使用してフルテキスト検索を行う仮想データベースから行を選択しています。ここでは例です:SQLiteでプリペアドステートメントとフルテキスト検索を使用する

SELECT * FROM Emails 
WHERE (Subject LIKE ?001 OR ?001 IS NULL) 
    AND (Author LIKE ?002 OR ?002 IS NULL) 
    AND (Body MATCH ?003 OR ?003 IS NULL) 

これは、個別に、または検索を行うには、任意の組み合わせで、ユーザが任意の条件(件名、作成者、またはボディ)を入力することができます。入力されない用語は、そのパラメータにNULLをバインドします。このステートメントの問題は、MATキーワードでORキーワードを使用できないことです。本文列を検索しない場合は、MATCHキーワードを使用してすべての行を返すステートメントを探しています。そのような声明はありますか?

答えて

0

私はLIKE '%' とMATCHを置き換えるために、実行時にSQL文を修正することになりました。それほどエレガントではありませんが、現在はうまくいきます。

0

私は次のことをお勧め:

SELECT * FROM emails 
WHERE ... 
    AND (CASE (SELECT COUNT(*) FROM emails WHERE body MATCH ?003) 
     WHEN 0 THEN 1 
     ELSE body MATCH ?003 
     END) 
+0

このコードが正しく動作することはご存知ですか?パラメータ3としてNULLをバインドすると、必要に応じて動作します。実際の文字列をバインドすると、「要求されたコンテキストで関数MATCHを使用できません」というエラーが表示されます。 – Sparafusile

関連する問題