2016-04-16 11 views
0

与えられた検索文字列sに対して、s.startsWith(value)== trueになるように、インデックス付きのvarchar(255)フィールド(〜1m行)から値を探したい。SearchStringの開始値を見つける

例: S = "Hello World" の

マッチ: "H"、 "こんにちは"、 "Hello World" の

が可能ということですか?

答えて

1

あなたは1つが、ほとんどの場合、どうなるよりも、反対の引数でINSTRを使用することができます。

SELECT * 
FROM mytable 
WHERE INSTR('hello world', mycol) = 1 

これはmycolは「こんにちは世界」は、任意のだから、位置1から始まるの部分文字列を持つレコードを返します。以下は一致します:

時間

HEL
地獄(スペースを末尾付き) ハロー
ハロー
ハローワット
ハロー
WO ハローWOR
ハローワール
のHello World

あなたは多分、次の冗長を加えて、より良いパフォーマンスを得ることができますSQLエンジンにmycolのインデックスを選択させるヒントがあります。

インデックスを使用しても、出力が高速になるわけではありません。値を持つテーブルを想像:

HEL
helaaaaaaa
helaaaaaab
helaaaaaac
...(1000のよりそのような記録、そして最終的に:)
のHello World

..エンジンはまだすべてのレコードをスキャンし、最初と最後を取得します。このクエリを実行しているアプリケーションがある場合は

、あなたはそれがこのようになりますように、それは、動的SQLを作成してみましょうことができます:

SELECT * 
FROM mytable 
WHERE mycol IN ('h', 'he', 'hel', 'hell', 'hello', 'hello ', 'hello w', 
       'hello wo', 'hello wor', 'hello worl', 'hello world') 

これは潜在的に最高のパフォーマンスを持っているでしょう。それはそれをしない場合は、確かにこの精巧なSQLはそれを行います。

SELECT * FROM mytable WHERE mycol = 'h' 
UNION ALL 
SELECT * FROM mytable WHERE mycol = 'he' 
UNION ALL 
SELECT * FROM mytable WHERE mycol = 'hel' 
UNION ALL 
SELECT * FROM mytable WHERE mycol = 'hell' 
UNION ALL 
SELECT * FROM mytable WHERE mycol = 'hello' 
UNION ALL 
SELECT * FROM mytable WHERE mycol = 'hello ' 
UNION ALL 
SELECT * FROM mytable WHERE mycol = 'hello w' 
UNION ALL 
SELECT * FROM mytable WHERE mycol = 'hello wo' 
UNION ALL 
SELECT * FROM mytable WHERE mycol = 'hello wor' 
UNION ALL 
SELECT * FROM mytable WHERE mycol = 'hello worl' 
UNION ALL 
SELECT * FROM mytable WHERE mycol = 'hello world' 
+0

ようCOLUMNNAMEはインデックスが、ここで使用されるのでしょうか?tableNameの から選択しますか* – hansmaad

+0

あなたのインスタンスで 'EXPLAIN PLAN'をチェックすることができます。そうでない場合は、 'AND mycol like 'h%''を追加することができます。これは重複していますが、エンジンがインデックスを使用する利点を検出するのに役立ちます。 – trincot

+0

良いアイデア、とにかく分かりやすい長さだと思いますので、追加の 'hel%'を使うことができます – hansmaad

0

あなたはこのためにlikeを使用したい:

where col like 'hello%' -- or whatever 

または

where col like concat(@s, '%') 

理由likeを使用すると、パターンがワイルドカード文字で始まらないため、索引を使用できるということです。

編集:

論理が逆転している可能性があります。もしそうなら、あなたはまだのように使用することができます。この場合

where @s like concat(col, '%') 

列は関数の引数であるので、しかし、インデックスは、使用することはできません。

+0

私はそれを試してみましょう、しかし、インデックスが使用できない場合、それは遅すぎるのではないかと心配しています。 – hansmaad

0

"like"をSQLで使用できます。

は `= 1 'で使用する場合は、 '時間%'

関連する問題