mysql:15414
From: Meiji KIMURA <Meiji KIMURA <meiji.kimura@xxxxxxxxxx>>
Date: Wed, 06 Oct 2010 13:25:42 +0900
Subject: [mysql 15414] Re: not in句がうまく動かない。
木村です。 これはMySQL 4.xで演算子NOTの優先順位が最上位だったことが原因だと思います。 そのためid % 2 not in (1);では、%より先にnotのほうが先に評価されてしまう、 すなわちid % (2 not in (1));相当になり、結果セットが戻らないのだと思います。 # 5.xではNOTの優先順位がかなり下がりました。See this manual. http://dev.mysql.com/doc/refman/5.1/ja/operator-precedence.html これを避けるためには、なかでさんが行っているように、かっこをつけて 優先順位を明確にするか、MOD()関数を使うと正しい値が戻ります。 mysql> SELECT * FROM `usrs` WHERE (id % 2) not in (1); +----+------+ | id | name | +----+------+ | 2 | ふご | +----+------+ 1 row in set (0.00 sec) mysql> SELECT * FROM `usrs` WHERE mod(id,2) not in (1); +----+------+ | id | name | +----+------+ | 2 | ふご | +----+------+ 1 row in set (0.00 sec) なお、下記も旨く動作するのは、演算子!=の優先順位が%より低いためです。 > SELECT * FROM `usrs` WHERE id % 2 != 1; (2010/10/06 11:07), nakade wrote: > なかでと申します。 > > 先に投稿させていただいた件についてですが、 > 原因は不明ですが、解消する方法が分かりましたので > 報告させていただきます。 > > > 2010年10月5日19:28 nakade<nakade@xxxxxxxxxx>: > >> このとき、idフィールドが偶数のデータを取り出したくて >> >> SELECT * FROM `usrs` WHERE id % 2 not in (1); >> >> のようなSQLを発行したのですが、「返り値が空でした(行数0)」のような >> 表示がされます。なお、 >> > > SELECT * FROM `usrs` WHERE id % 2 not in (1); > > を > > SELECT * FROM `usrs` WHERE (id % 2) not in (1); > > のようにしたところ、期待する動作となりました。
15412 2010-10-05 19:28 [nakade <nakade@xxxxx] not in句がうまく動かない。 15413 2010-10-06 11:07 ┗[nakade <nakade@xxxxx] -> 15414 2010-10-06 13:25 ┗[Meiji KIMURA <meiji.] 15415 2010-10-06 13:55 ┗[nakade <nakade@xxxxx]