2009-04-29 5 views
14

MySQLのワイルドカードは - すべてを返しますので、そこに1

SELECT * FROM table WHERE col LIKE '%' 

です。動作していないクエリ明らかに

SELECT * FROM table WHERE col = '*' 

*のワイルドカードがありますが、私はちょうど私がワイルドカードをたい場所を示すためにそこにそれを置きます。私が選択している列には1〜12の整数が含まれており、特定の番号を持つすべてのレコード、またはワイルドカードを持つすべてのレコードを選択できるようにしたいと考えています。 =は、ワイルドカードのサポートを提供していないため、LIKEを使用するための

おかげで、

答えて

11

LIKE基本的に=と同じですが、LIKEではワイルドカードを使用できます。

これらの2つのクエリは同じ結果を返します。

SELECT * FROM table WHERE col LIKE 'xyz'; 
SELECT * FROM table WHERE col='xyz'; 

を「%」がないとLIKEクエリで、それが効果的に「=」と同じです。

整数列の選択を行う場合は、IN()またはBETWEEN演算子の使用を検討する必要があります。しかし、少なくとも2つの異なる種類のクエリが必要であることを条件として、クエリではなくコードで2つの別々の条件を処理する必要があるようです。

編集:私は、LIKEと=は、普通の、人間の鼓動の文字列比較の使い方でのみ似ていることを明確にする必要があります。同じでない状況(言語セットなど)があるため、MySQL Manualの動作を詳しく調べてください。

+0

ありがとう、ちょうど私が探していたもの。それをコードで処理し、必要なときに特定のWHERE節を含むようにクエリを変更します。 – Dan

+0

MySQLはどちらをサポートしていますか?私はそれがちょうどTSQLだと思った –

+0

@ジョー:BETWEENは標準SQLです。私は、BETWEENをサポートしていないSQLをサポートするシステムには一度も会ったことがありません。 –

7

理由があります。そうでなければ、LIKEの理由はありません。

0
SELECT * FROM table WHERE col RLIKE '.*' 

つまり正規表現LIKEです。

+0

この素晴らしいMySQLオペレータを思い出させてくれてありがとう。 RLIKE別名REGEXPは知っておく価値があります:http://dev.mysql.com/doc/refman/5man/releasexp.html – artlung

8

すべてを選択する場合は、なぜWHERE句を付け加えますか?ワイルドカードを置くのではなく、条件付きで置いておいてください。あなたのクエリがパラメータcase文を駆動していると仮定すると、

+1

私はそれを考えていましたが、それは無意味ではなく、ワイルドカードを例にとって、実際にはテキストをその片面または両面にアンカーします。それから私は質問を詳細に読み直しました。あなたは正しいです、彼はただ彼の申し込みのためにどこを離れなければならないのですか? – chaos

+1

ダン、どこの部分がオプションなのか分かりますよね?あなたがそれをオフにすると、すべての行が選択されます。 – allyourcode

0

は、おそらくあなたはそれはあなたが渡した整数値を使用することになりそうでない場合、値をたくない場合は@myvariableがnullのいずれかである

select * from mytable 
where col like case when @myvariable is null then % else myvariable end 

適切である。

0

zombatの答えは素晴らしいですが、私は彼の答えであなたが整数を選択していることに気付いただけです。彼はIN()とBETWEEN()について言及しました。ここでは、これらの構文を使用する例と、整数フィールドに対していくつかのオプションを使用する例を示します。

SELECT * FROM table WHERE col = 1; 
SELECT * FROM table WHERE col BETWEEN 1 AND 12; 
SELECT * FROM table WHERE col BETWEEN 6 AND 12; 
SELECT * FROM table WHERE col <= 6; 
SELECT * FROM table WHERE col < 6; 
SELECT * FROM table WHERE col >= 6; 
SELECT * FROM table WHERE col > 6; 
SELECT * FROM table WHERE col <> 6; 
SELECT * FROM table WHERE col IN (1,2,5,6,10); 
SELECT * FROM table WHERE col NOT IN (1,2,5,6,10); 
0

次のレポート のためのストアドプロシージャを構築することは、私の解決策である一方で、私は、このようなケースに遭遇している、これはあなたが考えていたものであると思います:)

set @p = "ALL"; 

問合せ:

select * from fact_orders 
where 
dim_country_id = if(@p is null or @p="ALL", dim_country_id, @p) 
limit 10 
; 
0

あなたの値が(1,12)の範囲にある場合:

select * fro col = 5、Col < = 5の表。 //これはcol = 5と同じです。

select * from table where col> = 0そしてcol < = 12です。 //これはcol =任意の値に等しい

同じ行は、2つのパラメータを適切に選択することによって両方の効果を生成できます。 2つの異なる方法で動作する必要がある準備済みの単一の文が必要なときに、同様の問題に直面しました。列内の特定の値をチェックするか、その列を完全に無視します。

関連する問題