web-dev-qa-db-ja.com

指定された文字列で始まるエントリをSQLServerデータベースからフェッチするにはどうすればよいですか?

タグシステムで使用する単語がたくさんあるデータベースがあります。オートコンプリートボックスに必要なコードを作成しましたが、データベースから一致するエントリを最も効率的な方法でフェッチする方法がわかりません。

私はLIKEコマンドを知っていますが、それはEQUALコマンドに近いように思えます。入力した単語とまったく同じ単語しか取得できません。

私の計画では、すべての行を読み取ってから、C#のstring.StartsWith()関数とstring.Contains()関数を使用して、適合する単語を見つけますが、大規模なデータベースでは、すべての行を読み取るのは非効率的であり、次に、それらをフィルタリングします。

SQL Serverから特定の文字列で始まる、またはその文字列を含む行のみを読み取る方法はありますか?

16
Erlend D.

Likeを使用する場合は、ワイルドカードとして%記号を指定します。 Helloで始まる文字列が必要な場合は、LIKE'Hello% 'を使用します。文字列のどこかにHelloが含まれる文字列が必要な場合は、LIKE'%Hello% 'を使用します。

効率に関しては、Likeの使用は最適ではありません。全文検索を調べる必要があります。

36
Fosco

私はLIKEコマンドを知っていますが、それはEQUALコマンドに近いように思えます。入力した単語とまったく同じ単語しか取得できません。

これは、ワイルドカードを使用していないためです。

WHERE column LIKE 'abc%'

... column値が「abc」で始まる行を返します。ワイルドカードを使用する場合、これがcolumn... er列のインデックスを使用できる唯一のバージョンであることを指摘します。

WHERE column LIKE '%abc%'

... column値に「abc」が含まれる行を返します。 LIKEの左側をワイルドカード化すると、インデックスを使用できないことが保証されます。

SQL Serverは正規表現をネイティブにサポートしていません。機能にアクセスするには、CLR関数を使用する必要があります。ただし、LIKEと同等のパフォーマンスを発揮します。

全文検索(FTS)は、テキストを検索するための最良の手段です。

10
OMG Ponies

次のステートメントを使用して、StartWith機能を実装することもできます。

LEFT('String in wich you search', X) = 'abc'

CHARINDEX('abc', 'String in wich you search') = 1

'String in wich you search' LIKE 'abc%'

最高のパフォーマンスを発揮するものを使用してください。

T-SQLではCONTAINSを使用できますが、クエリに含まれるテーブルにはフルテキストインデックスを使用する必要があると確信しています。

含む

全文検索の開始

2
Wil P