2017-05-15 16 views
1

要求に応じて0-9またはa-zで始まるタイトルを返すクエリを作成しています。番号については最初の文字が数字であるところを選択

SELECT * FROM table WHERE title LIKE 'a%'; 
SELECT * FROM table WHERE title LIKE 'b%'; 
SELECT * FROM table WHERE title LIKE 'c%'; 
/* etc... */ 

を、しかし、本当に問題で、それがある数、それが唯一の最初の文字であることを重要しません:私はやっている個々の文字のためので、私はtitle列に索引を持っています数値。私は次のようなものを求めています:

SELECT * FROM table WHERE title LIKE '0%' 
         OR title LIKE '1%'; 
         OR title LIKE '2%'; 
         OR title LIKE '3%'; 
/* etc... */ 

しかし、これはちょっとうんざりです。私の理解には、正規表現は実際にはインデックスではうまくいかず、文字列関数についてはわかりません。 WHERE SUBSTRING(title,1,1) IN (0,1,2,3,4,5,6,7,8,9)のようなものはまだインデックスを利用していますか、これを行うためのよりコンパクトな方法がありますか?

答えて

5

あなたの文字がすべての「ASCII」である場合、あなたが行うことができます:

where title >= '0' and title < ':' 

これは、インデックスを使用することができるはずです。

私は意味が少し難しいと認めますが、コロンは'9'の後の最初のASCII文字です。

+0

ニースとシンプルなソリューション。 +1 – GurV

1

@GordonすべてのASCII文字列が「0」との間であるという点で正しい「:」

同じ文字を含むクエリについても同様であり、「A」との間のすべての文字列は、「{」と一致します。

質問の2番目の部分については、WHERE SUBSTRING(title,1,1) IN (0,1,2,3,4,5,6,7,8,9)がインデックスを使用する場合、答えはいいえです。この場合、インデックスの列が関数SUBSTRINGで使用されるときは、テーブルのすべての値に関数を適用して、常にテーブル全体をスキャンする必要があります。

関連する問題