2010年10月 6日

[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@xxxxx>:
>
>> このとき、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);
>
> のようにしたところ、期待する動作となりました。


投稿者 xml-rpc : 2010年10月 6日 13:25
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/98928
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。