16

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

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

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

4

2 に答える 2

26

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

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 に対するアクションの数が少ない場合は、おそらく顕著なパフォーマンスの向上は見られないため、より単純なクエリを使用できます。

于 2010-04-05T16:43:32.827 に答える
11

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

^[:digit:]つまり、「値の始まり、その後に 1 桁」という意味です。

于 2010-04-05T16:24:16.583 に答える