Typecast到FLOAT

时间:2018-04-19 12:41:07

标签: casting floating-point mariadb mysql-8.0

以下查询未返回slopeintercept的预期/期望结果。我终于意识到slopeintercept在我的锚点查询中被强制转换为整数,并通过递归保持整数。

WITH RECURSIVE t AS (
    SELECT id parentId, idPublic parentIdPublic, name parentName,
           slope parentSlope, intercept parentIntercept,
    id, idPublic, name, type, 1 slope, 0 intercept, value
    FROM measurements
    WHERE id IN (414,415,416,417,491)
    UNION ALL
    SELECT t.parentId, t.parentIdPublic, t.parentName,
           t.parentSlope, t.parentIntercept,
           m.id, m.idPublic, m.name, m.type,
           t.slope*pchm.sign*m.slope slope,
           t.intercept+t.slope*pchm.sign*m.intercept intercept, m.value
    FROM t
    INNER JOIN subpoints sp ON sp.measurementId=t.id
    INNER JOIN measurements m ON m.id=sp.measurementId
)
SELECT slope, intercept FROM t;

slopeintercept需要能够存储大量不同的值,并且准确度并不重要,所以我觉得FLOAT是最好的。我slopeintercept的架构如下所示:

`slope` FLOAT NOT NULL DEFAULT 1,
`intercept` FLOAT NOT NULL DEFAULT 0,

作为黑客解决方案,我将我的锚点查询更改为:

SELECT id parentId, ..., 1.0 slope, 0.0 intercept, value

我认为正确的解决方案是将这两个值指定为FLOAT,但文档似乎不允许。我可以DECIMAL,但是,slopeintercept可能存在广泛的价值问题。

我可以将slopeintercept投射到FLOAT吗?如果没有,最佳解决方案是什么?

1 个答案:

答案 0 :(得分:0)

认为 UNION是恶棍,而不是WITH等等。UNION喜欢根据首先定义数据类型 SELECT。当然,对于WITH RECURSIVE,您无法选择交换SELECTs

所以...我投票给你的'黑客解决方案'0.0和1.0。或者,这些可能更清楚:0e0和1e0。 (仍然是一个kludge,但它指向FLOAT,而不是DECIMAL。)

我也感到遗憾的是CASTing FLOAT DOUBLE(或{{1}})的缺席。