59227


MySQL の CTE の列の型に、double 精度の浮動小数点であることを強制したいのですが、これは可能でしょうか？

というのも、[MySQL :: MySQL 8.0 Reference Manual :: 13.2.13 WITH Syntax (Common
Table Expressions)](https://dev.mysql.com/doc/refman/8.0/en/with.html#common-
table-expressions-syntax) のページを見ていたのですが、

  1. MySQL の CTE の syntax には column type を指定するところがない
  2. "The types of the CTE result columns are inferred from the column types of the nonrecursive SELECT part only" つまり再起CTEでは最初の select 区のフィールドの型によって、その CTE 全体の戻り値の型が決定される。 
    * つまり、初期値が int で、 union していく中で float/double になっていくような、集計系の CTE では、これはあまり良い性質ではないように思われる
  3. 初期の select 区において double 型にキャストしようとドキュメントを見ているが、それを行う項目が見当たらない 
    * <https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html> を見ても、 Decimal (自分の理解だといわゆる BigDecimal) はあるが、 float/double に相当するデータ型はない

### 質問

mysql の再起 CTE にて、戻り値フィールドの型を確実に double (倍精度浮動小数点) になるようにすることは可能ですか？


CC BY-SA 4.0
2019-03-20T07:59:27.893
53583
2019-09-24T01:03:52.003
754
question
mysql
mysql の再起 CTE で float 型を取り扱いたい


CTEには詳しくないので外してるかもしれませんが、

[code]

    SELECT intvar + 0.0
    
[/code]

みたいなことをすると結果は浮動小数点になると思います。


CC BY-SA 4.0
2019-03-21T05:06:38.213
53611
2019-03-21T05:06:38.213
3249
53583
answer


MySQL 8.0.17 から利用可能な、 cast as float/double で解決可能でした。

[code]

    with recursive cte as(
      select cast(1 as double) as v
      union all
      select v * 1.1 from cte where v < 10
    )
    select v from cte;
    
[/code]

これを確認するにあたって、一旦上記を view にした上で、 `desc` することで、たしかに double になっていることを確認しました。

[code]

    mysql> create view testcastdouble as (
        ->   with recursive cte as(
        ->     select cast(1 as double) as v
        ->     union all
        ->     select v * 1.1 from cte where v < 10
        ->   )
        ->   select v from cte
        -> );
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> desc testcastdouble;
    +-------+--------+------+-----+---------+-------+
    | Field | Type   | Null | Key | Default | Extra |
    +-------+--------+------+-----+---------+-------+
    | v     | double | YES  |     | NULL    |       |
    +-------+--------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
[/code]


CC BY-SA 4.0
2019-09-24T01:03:52.003
59227
2019-09-24T01:03:52.003
754
53583
answer