MySQL: ゼロはFALSE、イチはTRUE

MySQLにおける、TRUEとFALSEとゼロとイチ。


同僚が WHERE column1 = 1 OR 2 が全ての行を返すと一瞬で看破していてすごい


後者で悩まされたの思い出したなぁ

select * from sample where id = 1 or 2;
+----+-----+
| id | col |
+----+-----+
|  1 | a   |
|  2 | b   |
|  3 | c   |
+----+-----+

select * from sample where id = (1 or 2);
+----+-----+
| id | col |
+----+-----+
|  1 | a   |
+----+-----+


で。
うっかり私は「ゼロがFALSE、それ以外はTRUE」と勘違いをして、こんなツイートをしてしまいました。

本のタイトルになりそうですね。
「ゼロかそれ以外か - MySQLという生き方」

間違いでした!

 MySQLにおいて、「ゼロはFALSE、イチはTRUE」それ以外はTRUEでもFALSEでもありません。



データ登録:

mysql> CREATE TABLE t24 (num float);
mysql> insert into t24  VALUES (-2), (-1), (0), (1), (2), (3), (-0.3), (0.4),(1.2);


確認:

mysql> SELECT num, (num=FALSE), (NUM=TRUE) FROM t24;
+------+-------------+------------+
| num  | (num=FALSE) | (NUM=TRUE) |
+------+-------------+------------+
|   -2 |           0 |          0 |
|   -1 |           0 |          0 |
|    0 |           1 |          0 |
|    1 |           0 |          1 |
|    2 |           0 |          0 |
|    3 |           0 |          0 |
| -0.3 |           0 |          0 |
|  0.4 |           0 |          0 |
|  1.2 |           0 |          0 |
+------+-------------+------------+
9 rows in set (0.00 sec)

わお。

追記[2022/08/15]

 タイトルが正確ではないという指摘をいただきました。本来の意味としては、まったくご指摘のとおりです。

どちらかというと「FALSEはゼロ、TRUEはイチ」の方が正しいかもしれません!

TRUE + TRUEは2ですが、2 IS TRUEは1

 本記事は、数字に焦点を当てたもので「ゼロ、イチはわかった。ではそれ以外は?」という話の展開であるため、このようなタイトル付けをしていますが、考え方としては指摘のとおりなので、お読みのみなさまにおかれましてはそのように理解していただければと思います。

同追記(おまけ)

mysql> SELECT TRUE+TRUE, TRUE/2, TRUE+TRUE=TRUE, TRUE-TRUE=FALSE;
+-----------+--------+----------------+-----------------+
| TRUE+TRUE | TRUE/2 | TRUE+TRUE=TRUE | TRUE-TRUE=FALSE |
+-----------+--------+----------------+-----------------+
|         2 | 0.5000 |              0 |               1 |
+-----------+--------+----------------+-----------------+

再追記

 TRUEかFALSEかの判定って、イコールではなく IS を使うべきだったのか? だとすると当初の私の「勘違い」だと思っていた「ゼロ以外はTRUE」は正しかったことになる。
 現実的には、今回の元ネタのように誤って書いてしまった挙動の理解のために役にたつ知識であって、わざわざ数値演算をした結果を TRUE/FALSE判定することはないと思うので、知らなくてもかまわないのですが、この「IS」の挙動、知らなかったなぁ・・・。

mysql> SELECT num, num IS FALSE, num IS TRUE FROM t24;
+------+--------------+-------------+
| num  | num IS FALSE | num IS TRUE |
+------+--------------+-------------+
|   -2 |            0 |           1 |
|   -1 |            0 |           1 |
|    0 |            1 |           0 |
|    1 |            0 |           1 |
|    2 |            0 |           1 |
|    3 |            0 |           1 |
| -0.3 |            0 |           1 |
|  0.4 |            0 |           1 |
|  1.2 |            0 |           1 |
+------+--------------+-------------+
9 rows in set (0.01 sec)

つい追記[2022/08/16]

 なんだかもにょもにょするのですが、たぶん「真か偽か」という状態の話と「TRUEかFALSEか」という値の話は別々にすべきことなのかもしれない、との考えに至りました。




Zero dolphin image by Dall-E