目次

本エントリの概要
- 「プログラマのための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