0

;セミコロン ( ) 記号で値を検索しています。ので、私は持っています:

SELECT * FROM table WHERE value MATCH '; "+lookingFor+"*'

SQLiteで論理エラーが発生しています。プログラム ";" への説明方法 コードを分割するためのものではありませんか?私が間違っていることは何ですか?

PS。値列の例:

apple; orange; banana
pineapple; watermelon

これはクエリです:

query = "SELECT id AS _id, 
entry_id , 
re_value, 
ke_value, 
g_value 
FROM search_eng_fts 
WHERE g_value MATCH '"
+ lookingFor+ "* OR
; "+lookingFor+"*'
ORDER BY length(g_value) 
LIMIT 100";
4

2 に答える 2

2

次の SQL が機能します。

SELECT * FROM list WHERE value like '%; banana%'

SQL フィドル

SQL インジェクションを回避するための措置を講じる必要があるかもしれませんが、

于 2013-08-28T11:39:31.560 に答える
2

SQLiteのドキュメントによると

MATCH 演算子は、match() アプリケーション定義関数の特別な構文です。デフォルトの match() 関数の実装では例外が発生し、実際には何の役にも立ちません。ただし、拡張機能は、より役立つロジックで match() 関数をオーバーライドできます。

値を区切られた文字列として保存するのではなく、意図したとおりにリレーショナル データベースを使用することを検討したことがありますか。そのため、各値は新しいテーブルに独自の行を持ちます。

例えば代わり​​に

T

TID     Name        Value
1       Test        apple; orange; banana
2       Test2       pineapple; watermelon

あなたは2つのテーブルを持っています、

T - 鍵情報を保存する

TID     Name
1       Test
2       Test2

TValues - Tへのリンクを使用して値を保存する

TID     Name
1       apple
1       orange
1       banana
2       pineapple
2       watermelon

このようにして、クエリは次のようになります。

SELECT  T.TID, T.Name, TValues.Name
FROM    T
        INNER JOIN TValues
            ON T.TID = TValues.TID
WHERE   TValues.Name = 'apple';

単一の文字列に戻る必要がある場合は、SQLite でGROUP_CONCATを使用できます。

SELECT  T.TID, T.Name, GROUP_CONCAT(TValues.Name, '; ') AS Value
FROM    T
        INNER JOIN TValues
            ON T.TID = TValues.TID
GROUP BY T.TID, T.Name;

SQL Fiddle の例

于 2013-08-28T12:12:15.827 に答える