最初の文字が数字ではない行を見つけようとしています。私はこれを持っています:
SELECT DISTINCT(action) FROM actions
WHERE qkey = 140 AND action NOT REGEXP '^[:digit:]$';
しかし、最初の文字だけをチェックする方法がわかりません...
まず、クエリにわずかなエラーがあります。そのはず:
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 に対するアクションの数が少ない場合は、おそらく顕著なパフォーマンスの向上は見られないため、より単純なクエリを使用できます。
現在の正規表現は、最初の文字だけではなく、正確に 1 つの数字で構成される値と一致します。その末尾からを削除するだけ$
です。つまり、「値の終わり」を意味します。さらにチェックするように指示しない限り、最初の文字のみをチェックします。
^[:digit:]
つまり、「値の始まり、その後に 1 桁」という意味です。