[前][次][番号順一覧][スレッド一覧]

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]