理解带有浮点数的递归 cte

Understanding recursive cte with floats

我想创建一些数据的直方图,但我使用的工具没有直方图工具,只有条形图工具。因此,我需要填补空白并自己创建垃圾箱。我正在尝试使用递归 cte 和左连接来完成此操作(对于 SQL 来说是很新的,所以如果术语不正确,我们深表歉意)。我似乎能够用整数做我想做的事,但在我移动到实数时遇到问题。

我在下面解释了四个例子。

  1. 生成一个 table,n 从 0 到 500,步长为 1 没问题,基本上是我想要的,除了 table 从 0 到 50步长为 0.1.

  2. 另一个 table,步长为 0.1,从 0 到 9。效果很好,但不是我想要的范围。

  3. 一旦我使用 n>=10 它就不再起作用了。

  4. 在 SELECT 语句中我使用 0,而不是 0.0。没用。

问题:

  1. 如何生成 table,其中 n 的行从 0 到 50,步长为 0.1?
  2. 为什么我必须在 SELECT x 中使用尽可能多的小数?对于 0.1 的步长,我需要输入 0.0,对于 0.01,我需要输入 0.00。

备注:

1.Works(returns 501 行):

WITH RECURSIVE cte1 (n) AS
(
  SELECT 0
  UNION ALL
  SELECT n + 1 FROM cte1 WHERE n < 500
)
SELECT * FROM cte1;

2.Works(returns 91 行:

WITH RECURSIVE cte1 (n) AS
(
  SELECT 0.0
  UNION ALL
  SELECT n + 0.1 FROM cte1 WHERE n < 9
)
SELECT * FROM cte1;

3.Does 无效(回复 Error Code: 1264. Out of range value for column 'n' at row 1):

WITH RECURSIVE cte1 (n) AS
(
  SELECT 0.0
  UNION ALL
  SELECT n + 0.1 FROM cte1 WHERE n < 10
)
SELECT * FROM cte1;

4.Does 无效(回复Error Code: 3636. Recursive query aborted after 1001 iterations. Try increasing @@cte_max_recursion_depth to a larger value.):

WITH RECURSIVE cte1 (n) AS
(
  SELECT 0
  UNION ALL
  SELECT n + 0.1 FROM cte1 WHERE n < 9
)
SELECT * FROM cte1;

来自文档:

https://dev.mysql.com/doc/refman/8.0/en/with.html#common-table-expressions-recursive

The types of the CTE result columns are inferred from the column types of the nonrecursive SELECT part only, and the columns are all nullable. For type determination, the recursive SELECT part is ignored.

在你的情况下,它查看 SELECT 0.0 并假设它是 DECIMAL(2,1),这就是为什么它在浮点数前后不允许超过 1 位数字。

因此您需要向解析器提示您确切想要的类型:

SELECT CAST(0 AS DECIMAL(3,1))SELECT CAST(0 as float)

这样就可以了。

希望这能回答您的两个问题。

Upd. #4 不起作用,因为在每次迭代中它将结果转换为整数,0 + 0.1 变成 0.