2013-12-20 72 views
0

我有我的選擇一些困惑:DOUBLE被返回BLOB

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

雖然mergedData.rawValuemergedData.validatedValue回報DOUBLE的IFNULL語句返回BLOB。爲什麼會發生?我怎麼才能讓它返回一個DOUBLE呢?

編輯: 我通過模擬FULL JOIN合併兩個在我的Select中具有完全相同結構的表。的數據存儲爲兩個表中一個雙重:

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:我的全SELECT:

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 
+0

快,讓你的表結構 –

+0

@AlmaDo更新的問題 – RononDex

+0

我不知道你的數據的裝置和它從何而來,但如果兩個表格描述了幾乎相同的數據(看起來),爲什麼不使用'NOX_raw'和'NOX_validated DEFAULT NULL'(我的答案仍然適用)。這將爲您節省合併桌子的痛苦。 – AmazingDreams

回答

1

只投它

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 

Perheps你就不需要投它,然後

+0

檢查我編輯的問題 – RononDex

+0

COALESCE沒有工作,仍然返回爲BLOB。然而,演員到小數的作品很好! :) – RononDex

+0

但是我仍然不明白爲什麼它首先作爲BLOB返回。 – RononDex