mysql - DOUBLE 作为 BLOB 返回

标签 mysql typing

我对我的 SELECT 有一些困惑:

SELECT  
    mergedData.rawValue,
    mergedData.validatedValue,
    IFNULL(mergedData.validatedValue, mergedData.rawValue) as mergedValue
FROM
    [...]

虽然 mergedData.rawValuemergedData.validatedValue 返回 DOUBLE,但 IFNULL 语句返回 BLOB。为什么会发生这种情况?我怎样才能让它返回一个 DOUBLE 呢?

编辑: 我通过模拟 FULL JOIN 来合并 Select 中具有完全相同结构的两个表。数据在两个表中都以 DOUBLE 形式存储:

TableRawData(NOX 加载到 mergedData.rawValue):

timed (BIGINT(20)) --- NOX (DOUBLE)
1380583800000          8.972167

TableValidatedData(NOX 加载到 mergedData.validatedValue 中):

timed (BIGINT(20)) --- NOX (DOUBLE)
1380583800000          9.506166

EDIT2:我的完整选择:

SET @StartTime  = 1356998400000;
SET @EndTime    = 1386546000000;

SELECT  
    mergedData.rawValue,
    mergedData.validatedValue,
    CAST(IFNULL(mergedData.validatedValue, mergedData.rawValue) AS DECIMAL(10, 5)) as mergedValue
FROM
 (SELECT 
        Month(FROM_UNIXTIME(timed / 1000)) as months,
            Year(FROM_UNIXTIME(timed / 1000)) as years,
            DAYOFMONTH(FROM_UNIXTIME(timed / 1000)) as days,
            HOUR(FROM_UNIXTIME(timed / 1000)) as hours,
            MINUTE(FROM_UNIXTIME(timed / 1000)) as minutes,
            IF(true, avg(NOX), null) as rawValue,
            FROM_UNIXTIME(timed / 1000) as timeValue,
            IF(true, 1, 0) as IsValid,
            NULL as validatedValue
    FROM
        nabelnrt_bas
    WHERE
        timed > @StartTime
            AND timed < @EndTime
    GROUP BY concat(years, months, days) UNION (
 SELECT 
        Month(FROM_UNIXTIME(timed / 1000)) as months,
            Year(FROM_UNIXTIME(timed / 1000)) as years,
            DAYOFMONTH(FROM_UNIXTIME(timed / 1000)) as days,
            HOUR(FROM_UNIXTIME(timed / 1000)) as hours,
            MINUTE(FROM_UNIXTIME(timed / 1000)) as minutes,
            IF(true, avg(NOX), null) as validatedValue,
            FROM_UNIXTIME(timed / 1000) as timeValue,
            IF(true, 1, 0) as IsValid,
            NULL as rawValue
    FROM
        nabelvalidated_bas
    WHERE
        timed > @StartTime
            AND timed < @EndTime
    GROUP BY concat(years, months, days))) as mergedData

最佳答案

直接转换

SELECT  
    mergedData.rawValue,
    mergedData.validatedValue,
    CAST(IFNULL(mergedData.validatedValue, mergedData.rawValue) AS DECIMAL[(M[,D])]) as mergedValue
FROM

请注意DECIMAL[(M[,D])],您应该在定义表时填写它。

编辑,COALESCE可能也很有趣。使用示例;

SELECT  
    mergedData.rawValue,
    mergedData.validatedValue,
    COALESCE(mergedData.validatedValue, mergedData.rawValue) as mergedValue
FROM

也许你不需要转换它

关于mysql - DOUBLE 作为 BLOB 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20700281/

相关文章:

php - 如何编辑我的查询以显示每天的输出?

mysql - 在 CREATE PROCEDURE 中使用 DECLARE 和准备好的语句时出现语法错误

值具有类型的 typescript keyof

python - 类型错误 : Type Tuple cannot be instantiated; use tuple() instead

generics - 如何告诉编译器内部字段实现了特征或通用特征只有 2 个变体?

mysql - 在 MySQL 中索引只有一列的表的性能

javascript - php/mysql 动态下拉菜单的 AJAX RETURN 帮助

php - 如何从查询更新表(MYSQL)

c++ - _r 后缀是什么意思?

python - 基于枚举参数的条件返回值类型