「プログラマのためのSQL第4版」のサンプルコードをMySQLで動くようにしてみた(38.6 曜日)
目次
本エントリの概要
- 「プログラマのためのSQL第4版」の読書会に参加させてもらってるのですが、たまには予習をしようと思い付きでやってみました。
- 突発的なやつなので継続はしないつもりです。
- 本エントリでは動かすことが目的なので内容の理解は後回しです。
第38章 38.6.1 曜日によるソート P733
P732までのSQLは問題なく動作するのですがP733のは少し書き換えが必要でした。
元のSQL
SELECT day_name, CAST (POSITION(day_name IN 'SUNMONTUEWEDTHUFRISAT')/3 AS INTEGER) + 1 AS day_nbr FROM Foobar ORDER BY day_nbr;
SELECT day_name, CAST(POSITION(day_name IN 'SUNMONTUEWEDTHUFRISAT')/3 AS SIGNED INTEGER) + 1 AS day_nbr FROM Foobar ORDER BY day_nbr;
結果
mysql> SELECT day_name, -> CAST(POSITION(day_name IN 'SUNMONTUEWEDTHUFRISAT')/3 AS SIGNED INTEGER) + 1 AS day_nbr -> FROM Foobar -> ORDER BY day_nbr; +----------+---------+ | day_name | day_nbr | +----------+---------+ | SUN | 1 | | MON | 2 | | TUE | 3 | | WED | 4 | | THU | 5 | | FRI | 6 | | SAT | 7 | +----------+---------+ 7 rows in set (0.00 sec)
ポイント
- 書籍上もダウンロードできるサンプルコードも
CAST
と(
の間に空白があるが、少なくともMySQLではこれが許されません。 CAST(s AS INTEGER)
はCAST(s AS SIGNED INTEGER)
またはCAST(s AS UNSIGNED INTEGER)
とする必要があります。- 今回の場合、計算過程にマイナス値は取りえないのでどちらでもいいでしょう。
結果
- 動きました。
検証環境
MySQL8.0.12