web-dev-qa-db-ja.com

MySqlは正規表現が好きではありませんか?

最初の文字が数字ではない行を見つけようとしています。私はこれを持っています:

SELECT DISTINCT(action) FROM actions 
WHERE qkey = 140 AND action NOT REGEXP '^[:digit:]$';

しかし、最初の文字だけをチェックする方法がわかりません...

16
TwixxyKit

現在の正規表現は、最初の文字だけでなく、正確に1桁で構成される値と一致します。その末尾から$を削除するだけです。これは、「値の終わり」を意味します。さらにチェックするように指示しない限り、最初の文字のみをチェックします。

^[:digit:]は機能します。つまり、「値の開始に続いて1桁」を意味します。

11
Chad Birch

まず、クエリにわずかなエラーがあります。そのはず:

NOT REGEXP '^[[:digit:]]'

二重角括弧に注意してください。空の文字列との一致を避けるために、次のように書き直すこともできます。

REGEXP '^[^[:digit:]]'

また、REGEXPを使用すると、インデックスが使用されなくなり、テーブルスキャンまたはインデックススキャンが発生することに注意してください。より効率的なクエリが必要な場合は、可能であればREGEXPを使用せずにクエリを書き直してみてください。

SELECT DISTINCT(action) FROM actions 
WHERE qkey = 140 AND action < '0'
UNION ALL
SELECT DISTINCT(action) FROM actions 
WHERE qkey = 140 AND action >= ':'

次に、(qkey、action)にインデックスを追加します。読むのはそれほど楽しいことではありませんが、パフォーマンスが向上するはずです。 qkeyごとにアクションの数が少ない場合は、パフォーマンスが目立って向上しない可能性があるため、より単純なクエリを使用できます。

24
Mark Byers