データベースにMySQLを使っているシステムにおいて、MySQLから数値を文字列として取得してそのまま表示したいということがあったのだけれども、DECIMAL型だとなんと小数点以下の末尾の0がそのまま表示されてしまうことが発覚。
(decimal_timeがDECIMAL(10,3)型で、double_timeがDOUBLE型)
DOUBLE型なら省略してくれるんですけどね。それならと思って、DOUBLE型にキャストしてみようと思ったのですが、MySQLではDOUBLE型へのキャストはできないようです(参考:MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.10 キャスト関数と演算子)。「CAST(decimal_time AS DOUBLE)」というようにキャストしてみようとすると、下記のようなエラーメッセージが表示されました。
Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DOUBLE) FROM work_time' at line 1
いろいろ考えた末、ちょっと長くなるけど、下記のように小数点以下が何桁まであるか調べて、その分の桁数で切り下げすることに。
SELECT decimal_time, CONCAT( CASE WHEN MOD(decimal_time, 1) = 0 THEN TRUNCATE(decimal_time, 0) WHEN MOD(decimal_time, 0.1) = 0 THEN TRUNCATE(decimal_time, 1) WHEN MOD(decimal_time, 0.01) = 0 THEN TRUNCATE(decimal_time, 2) ELSE decimal_time END, '時間') AS time FROM work_time
DECIMALの小数点以下の桁数の数をどう設定しているかによって変わってくるんですけどね。これが、DECIMAL(10,4)とかだったら、「WHEN MOD(decimal_time, 0.001) = 0 THEN TRUNCATE(decimal_time, 3)」という条件を追加すればいいです。
なお、先ほどDOUBLE型にはキャストできないと書きましたが、調べてみると関数を作成することで、DOUBLE型に変換することができるそうです。
参考:casting – Is it possible to cast a DECIMAL to DOUBLE in MySQL? – Stack Overflow
下記のような関数を作成し、
CREATE DEFINER=`root`@`localhost` FUNCTION `castDecimalAsDouble`(decimalInput DECIMAL(65,30)) RETURNS double DETERMINISTIC BEGIN DECLARE doubleOutput DOUBLE; SET doubleOutput = decimalInput; RETURN doubleOutput; END
実際に下記のSQLを実行すると、先ほどと同じ結果となりました。
SELECT decimal_time, castDecimalAsDouble(decimal_time) AS time FROM work_time
関数を利用できるなら、こちらのほうが便利かもしれないです。
コメント