「SQL」は標準化されているとはいえ、特に関数や演算子にはデータベース製品ごとに結構な差異が含まれています。「方言」と呼んだりしますね。
その「方言」のおかげで、うっかりハマったので、紹介するじょう。
計算が合わない!
事の発端は、SELECT句で行っていた少々複雑な計算が、なんか全然違う値を返していることに気づいたこと。式を分解しながら原因を突き止めたところ、累乗の計算で期待と異なる結果を返していることが原因だと分かりました。
何が起きたのか
シンプルな例として「10の三乗」が欲しいとします。まぁ、何も考えずに手を動かすと、このように書きますよね。
mysql> SELECT 10^3; +------+ | 10^3 | +------+ | 9 | +------+
10の3乗は、9です! ・・・・ってそんなことあるかぁっ!
実はMySQLでは ^ は、ビット演算の演算子なのです。XORです。
MySQL :: MySQL 8.0 リファレンスマニュアル :: 12.13 ビット関数と演算子
ということで 10→1010、3→0011 なので、
1010 XOR 0011 = 1001
(1001←9)
という正しい計算が行われたということですね。 もちろんこの式単独で見ればおかしいことにすぐに気づくのですが、複雑な式の結果が合わない、というところからこの演算子が累乗でないことに気づくまでには結構手間がかかりました。。
MySQLの累乗はパワー
MySQLで累乗の計算を行うには、POW() (またはPOWER())を使用します。こんな感じ。
mysql> SELECT POW(10,3); +-----------+ | POW(10,3) | +-----------+ | 1000 | +-----------+
なんだか見た目として(慣れないと) 10の3乗を指示した気分になれないですよね。。
PostgreSQL では
PostgreSQLでは「^」で累乗を表します。こっちのほうが多くのプログラム言語で見慣れているので気分良いですね。
pgdb=# SELECT 10^3; ?column? ---------- 1000
追記(2024/03/07正午頃)
Twitter(現X)で紹介したところ、「プログラム言語で累乗に ^ 使うのって少ないんじゃね?」「OracleやMSSQLでもPOWER()だよ。MSSQLでは ^ はXOR」など色々おしえてもらいました。
また、本エントリで多少の違和感を持ちつつ「累乗」と書いていたのですが、私が普段よく使っていた用語は「べき乗(冪乗)」でした。前者は自然数の場合のみ用いられる語とのことです。まぁ「3.14^2」みたいな式を累乗と呼んでも目くじらを立てる人もそうそういないと思いますけど、正確ではなかったな、と。(1000^3 を例にしておいてよかった)
以下のスレにて。
[日記更新] MySQLで二乗三乗は^じゃないんだじょう - sakaikの日々雑感~(T)編 https://t.co/aOaqUIZiFW #mysql_jp
— 坂井 恵(SAKAI Kei) (@sakaik) 2024年3月6日