2012-06-11 119 views
1

我正在將一個站點從mysql遷移到PostgreSQL(目前爲止我非常喜歡),但我對某個查詢有疑問。請注意,這不是一個存儲函數 - 這是一個手動傳入的Python腳本中的字符串(我知道這是一個糟糕的做法,但僅適用於內部應用程序)。在MySQL中,查詢是結構化的,像這樣:MySQL IF /查詢轉換爲PostgreSQL

SELECT 
    name, 
    SUM(IF(is_correct, 1, 0)) AS correct, 
    SUM(IF(is_correct, 0, 1)) AS wrong 
FROM 
    k_p AS p JOIN 
    k_v AS v ON (variable_id=v.id) 
WHERE 
    content_type_id=%s %s %s 
GROUP BY 
    v.id 
ORDER BY sort_order 

is_correct僅僅是一個布爾數據列,無論是0或1。我知道,你會在MySQL中,你不能直IF的Postgres裏。該文檔似乎表明,最好的轉換是使用case/when語句。我嘗試過沒有成功。 SUM/IF語句是拋出我的 - 查詢的其餘部分應該沒問題。任何建議將不勝感激!

獎金的問題:你會怎麼做,如果包括的一個查詢:

SUM(IF(ISNULL(is_correct), 0, 1)) AS wrong 

回答

5

你想你的CASE結構:

SELECT 
    name, 
    SUM(case when is_correct = 1 then 1 else 0 end) AS correct, 
    SUM(case when is_correct = 1 then 0 else 1 end) AS wrong 
FROM 
    k_p AS p JOIN 
    k_v AS v ON (variable_id=v.id) 
WHERE 
    content_type_id=%s %s %s 
GROUP BY 
    v.id 
ORDER BY sort_order 
+0

這看起來很有希望!僅僅爲了測試的目的,我運行了「SELECT SUM(case is_correct when 1 then 1 else 0 end)AS correct FROM k_p」,並得到了錯誤「ERROR:操作符不存在:boolean = integer」並帶有箭頭直到when。任何想法發生了什麼? –

+0

@i_thought_i_was_smart剛剛更新了代碼,它現在應該可以工作 –

+0

不錯!我想我想出了一個替代解決方案 - 「SELECT SUM(case(cast(is_correct as integer))1 then 1 else 0 end)FROM k_p」 - 似乎工作。哪種方式更「正確」? –

1
select name, correct, wrong 
from (
    SELECT 
     id, 
     name, 
     count(nullif(is_correct, false)) AS correct, 
     count(nullif(is_correct, true)) AS wrong 
    FROM 
     k_p AS p JOIN 
     k_v AS v ON (variable_id=v.id) 
    WHERE 
     content_type_id=%s %s %s 
    GROUP BY 
     v.id, name 
) 
ORDER BY sort_order