2013-09-10 57 views
0

我有一張用戶表和他們發送的消息的另一個表,我試圖找到消息的平均長度和平均長度如果用戶退休,則顯示一條消息。如果我試試這個:根據MySQL中的特定情況查找列的平均長度

SELECT u.id, 
AVG(LENGTH(m.body)) AS avg_msg_length, 
AVG(LENGTH(CASE m.is_retired WHEN true THEN m.body ELSE NULL END)) AS avg_msg_length_retired 
FROM Users u LEFT OUTER JOIN Messages m 
ON u.id = m.sender_id 
GROUP BY u.id; 

在結果我得到的平均長度不錯,但對於退休人員的平均長度剛好空值的列。

如果我試試這個:

SELECT u.id, 
AVG(LENGTH(m.body)) AS avg_msg_length, 
AVG(LENGTH(CASE m.is_retired WHEN "true" THEN m.body ELSE NULL END)) AS avg_msg_length_retired 
FROM Users u LEFT OUTER JOIN Messages m 
ON u.id = m.sender_id 
GROUP BY u.id; 

我得到的,

ERROR 1054(42S22):未知列 '‘真’' 在 '字段列表'。

我覺得這很奇怪,因爲is_retired字段是一個varchar。

我是否在LENGTH內使用CASE WHEN錯誤?我試圖CASE的第二種形式當過多爲:

AVG(LENGTH(CASE WHEN m.is_retired=true THEN m.body ELSE NULL END)) AS avg_msg_length_retired 

,並

AVG(LENGTH(CASE WHEN m.is_retired="true" THEN m.body ELSE NULL END)) AS avg_msg_length_retired 

,並得到同樣的結果如上。

回答

1

我喜歡length()case內:

SELECT u.id, 
     AVG(LENGTH(m.body)) AS avg_msg_length, 
     AVG(CASE WHEN m.is_retired = 'Y' THEN LENGTH(m.body) END) AS avg_msg_length_retired 
FROM Users u LEFT OUTER JOIN 
    Messages m 
    ON u.id = m.sender_id 
GROUP BY u.id; 

'Y'應該是任何字符或字符串表示的真理。

查詢的問題在於,您正在將字符表達式(is_retired)與數字表達式(true)混合在一起。與類型保持一致。

例如,這個計算結果爲假:

select 'true' = true; 

但這種計算爲真:

select 1 = true; 
+0

獲取長度內工作。但是,錯誤是由於已經在真正使用雙引號的查詢引起的。錯誤是由我認爲錯誤的命令序列引起的。無論如何謝謝! – gorangutan