MySQLにおける、TRUEとFALSEとゼロとイチ。
同僚が WHERE column1 = 1 OR 2 が全ての行を返すと一瞬で看破していてすごい
— yoku0825 (@yoku0825) 2022年8月15日
同僚が WHERE column1 = 1 OR 2 が全ての行を返すと一瞬で看破していてすごい
後者で悩まされたの思い出したなぁ
— hironomiu (@hironomiu) 2022年8月15日
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 |
+----+-----+ https://t.co/jJBdwVe840
後者で悩まされたの思い出したなぁ 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」と勘違いをして、こんなツイートをしてしまいました。
本のタイトルになりそうですね。
— 坂井 恵(SAKAI Kei) (@sakaik) 2022年8月15日
「ゼロかそれ以外か - MySQLという生き方」
本のタイトルになりそうですね。 「ゼロかそれ以外か - 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はイチ」の方が正しいかもしれません!
— yoku0825 (@yoku0825) 2022年8月15日
TRUE + TRUEは2ですが、2 IS TRUEは1
どちらかというと「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か」という値の話は別々にすべきことなのかもしれない、との考えに至りました。
きっとアレだ。TRUEとかFALSEとかに拘るからおかしいので、真か偽かという話をするならば、
— 坂井 恵(SAKAI Kei) (@sakaik) 2022年8月16日
「0は偽、それ以外は真」というだけの話であって、MySQLでは 0 にFALSEというラベルを、1にTRUEというラベルを与えただけ(TRUEは真の一例でしかない)と考えると良いの...か...? https://t.co/OVG8rZ9jIe