2017-02-23 9 views
1

が、私は2つの項目の一致がない旨のwhere句を持つ単純なクエリを実行しようとしてい一致しますまた試みました:mysqlのクエリは

where l.country not like (\"%USA%\", \"%CA%\") ORDER BY l.state 

複数の一致で「好き」を使用する方法はありますか?

+0

はい、正規表現ベースの低速なアプローチです。現在のもので何が問題なのですか – GurV

+1

あなたの実際のロジックは何ですか? USA _and_ CA、またはUSA _or_ CAを持たないレコードと一致させますか? –

答えて

1

これはあなたの元の状態である:

where l.country not like "%USA%" or "%CA%" ORDER BY l.state 

私はあなたが「国は米国でもカリフォルニアでもない」を意味するために、これを意図すると仮定

もしそうなら、あなたはそれをこのように記述します。

where l.country not like '%USA%' and l.country not like '%CA%' ORDER BY l.state 

しかし、SQLには構文がNOT LIKE 'X' OR 'Y'のためにありません。 LIKE述部には左オペランドと右オペランドが1つあります。

あなたが書いた式は有効な式ですが、あなたが考えるとは思いません。それはあなたがこれを書いていたかのようにのようなものです:

ある
where (l.country not like "%USA%") or ("%CA%") ORDER BY l.state 

は、2つの用語は、ORで区切られ、最初はLIKEの比較であり、第二には、独自のリテラルだけで単一の文字列です。これは表現の中で有効な用語ですが、何も役に立たないものです。それは書き込みのようです:

x = 6 * 8 + 0 

ゼロにはどのような効果がありますか?なし。


更新:間違っていましたが、私はあなたがそれを書いたときのクエリの効果を見落としました。ブール式では、2つの項がORの場合、2番目の項が常にTRUEの場合、最初の項が何であるかは関係ありません。

WHERE (some expression) OR (TRUE) 

これは常に該当します。

リテラル文字列'%CA%'は、空の文字列またはNULLではないため、trueとカウントされます。ですから元のクエリではWHERE句は国が何であっても常に真です。

+0

答えと明確な説明をありがとう! – Sackling

1

あなたは交代でREGEXPを使用することができます。

SELECT * 
FROM yourTable 
WHERE country NOT REGEXP '"%USA%"|"%CA%"' 

注:

あなたは、単一引用符で囲んだ文字列リテラルの内側に表示される二重引用符をエスケープする必要はありません。元のクエリは実行されませんでした。なぜなら、LIKEを使用している列と、別の列または文字列リテラル(通常は一重引用符)を比較する必要があるからです。

REGEXPは大文字と小文字を区別しないので、これはあなたのケースで問題には表示されませんが、私たちは、同じ結果をusacaを使用することもできました。