1

ショートストーリー。SQLite データベースと通信する必要があるプロジェクトに取り組んでいます。そして、いくつかの問題があります。

nodeId列とnodeName列を持つ 1 つの FTS テーブルがあります。nodeNames に何らかのテキスト パターンが含まれているすべての nodeIds を選択する必要があります。たとえば、内部に「Donald」が含まれるすべてのノード名。このスレッドで同様のことが議論されました。ポイントは、 CONTAINSキーワードを使用できないことです。代わりにMATCHを使用します。そして、ここに問題があります。この「Donald」という文字列をどのように「組み立てる」必要がありますか? 「*」または「%」文字で? これが私のクエリです:

SELECT * FROM nodeFtsTable WHERE nodeName MATCH "Donald"

SELECT文に多重比較を書いてもいいですか?私はこのようなことを意味します:

SELECT * FROM distanceTable WHERE pointId = 1 OR pointId = 4 OR pointId = 203 AND distance<200

あまり混乱しないことを願っています。前もって感謝します!

4

1 に答える 1

2

編集:申し訳ありませんが、FTS4 を使用しているという事実を見逃していました。これを行うことができるようです:

SELECT * FROM nodeFtsTable WHERE nodeName MATCH 'Donald'

ここに関連ドキュメントがあります。

Donaldが個別の単語であるすべてのエントリに一致させるために、ワイルドカード文字は必要ありません(たとえば、上記は に一致しDonald Duckます)。Donald単語の一部として一致させたい場合(例: ) 、適切な場所でDonalds使用する必要があります。*

SELECT * FROM nodeFtsTable WHERE nodeName MATCH 'Donald*'

クエリが機能しない場合は、二重引用符を使用したことが原因である可能性があります。

SQLite のドキュメントから:

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

FTS4 は機能を提供する拡張match()機能です。

はい、2 番目のクエリのように複数の条件を使用しても問題ありません。複雑な条件のセットがある場合、条件が評価される順序を理解することが重要です。ANDは常に前に評価されORます (それぞれ数学的な乗算と加算に類似しています)。AND実際には、 と の組み合わせを使用する場合は、わかりやすくするためにかっこを使用するのが常に最善だと思いますOR

--This is the same as with no parentheses, but is clearer:
SELECT * FROM distanceTable WHERE 
    pointId = 1 OR 
    pointId = 4 OR 
    (pointId = 203 AND distance<200)

--This is something completely different:
SELECT * FROM distanceTable WHERE 
    (pointId = 1 OR pointId = 4 OR pointId = 203) AND
    distance<200
于 2012-10-24T07:42:41.463 に答える