2016-03-29 4 views
0

私はmysqlデータベースから結果セットの '_'で値を除外する方法を探していました。mysqlで '_'を持たない値を選択する

なぜ次のSQL文は結果を返しませんか?

私はここで私が望んでいた結果である

select questionKey 
from labels 
where set_id = 674 
and questionKey like 'Class%' 
and locate('_',questionKey) = 0 ; 

戻り

questionKey 
ClassA 
ClassB 
ClassC 
ClassD 
ClassE 
ClassF 
ClassG 
ClassNPS 
ClassDis 

として試み最初のSQLた

select questionKey 
from labels 
where set_id = 674 
and questionKey like 'Class%' 
and questionKey not like '%_%' ; 

。両方のSQL文は論理的には同等であるように見えますが、そうではありません。

+1

LIKE句の下線は特別な意味を持ちます。任意の1文字に一致します。 –

答えて

1

tadmanとPM77として、すでにそれは特殊文字だ、と指摘しました。最初のクエリを使用する場合は、次のようにエスケープしてください(バックスラッシュに注意してください)。

select questionKey 
from labels 
where set_id = 674 
and questionKey like 'Class%' 
and questionKey not like '%\_%' ; 
1

LIKE文脈では、_は特別な意味を持ち、any single characterを表します。これは何かを意味する%以外の唯一のものです。

あなたのLOCATE()のバージョンがおそらく最高でしょうが、このようなテーブルスキャンを実行すると大量のデータが非常に遅くなる可能性があります。アンダースコアが何か重要なことを表している場合は、フラグフィールドを設定して索引を付けることができます。

あなたはまた、単一の条件でレコードをしようとすると、一致する正規表現を使用することができます。

REGEXP '^Class[^_]+' 
+0

REGEXPのアイデア@tadmanをありがとう。 REGEXP '^クラス[^ _] +'はレコードを除外できませんでしたが、REGEXP '^ Class。* _'は機能しませんでした。 –

関連する問題