untitled .engineer

技術系のブログ(仮)

「プログラマのためのSQL第4版」のサンプルコードをMySQLで動くようにしてみた(38.6 曜日)


目次


f:id:dupont_kedama:20190228135448p:plain

本エントリの概要

  • プログラマのための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;

MySQLで動くように変換したSQL

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