2011-03-12 63 views
4

我有一個像下面這樣的查詢結構,我想知道是否有一種方法可以將選擇查詢作爲一個使用CASE語句或其他方式寫入,以便將值插入到基於它們的適當變量中值。mysql switch case

DECLARE passes INT; 
DECLARE fails INT; 
.. 

SELECT count(score) 
INTO passes 
    FROM scores 
WHERE score >= 40; 

SELECT count(score) 
INTO fails 
    FROM scores 
WHERE score < 40; 

默多克想出了一個很好地解決了這個問題,我不得不做出一個改變是將每個值中有相應的變量

SELECT * 
INTO passes, fails 
FROM (SELECT SUM(CASE 
        WHEN score >= 40 THEN 1 
        ELSE 0 
        END) AS _passes, 
       SUM(CASE 
        WHEN score < 40 THEN 1 
        ELSE 0 
        END) AS _fails 
     FROM scores) AS x; 
+1

正如你到了那裏的40分也不會通過或失敗 – 2011-03-12 13:08:53

+0

感謝邏輯一個側面說明,上面的SQL僅僅是一個例子,實際的數據,邏輯等即時通訊使用是不同的。 – volting 2011-03-12 13:10:16

+0

這並不容易,因爲您從兩張不同的表中進行選擇。我想不出有什麼解決方案比你做的更有效率,因爲他們必須歸結爲兩個不同的「底層」查詢,至少你現在擁有的是什麼簡單易讀。 – 2011-03-12 13:26:54

回答

9

你可以做這通過爲每個得分做一個例子並返回1或0.然後將整個事情包裝在一個SUM(而不是COUNT)中,實際上爲每個匹配大小寫的實例添加一個。

SELECT 
SUM(CASE WHEN score >= 40 THEN 1 ELSE 0 END) AS passes, 
SUM(CASE WHEN score < 40 THEN 1 ELSE 0 END) AS fails 
FROM scores 
+0

謝謝你的工作..我只需要包裝另一個選擇語句來將值插入到變量中。 – volting 2011-03-12 14:09:21

3
DECLARE tpasses INT; 
DECLARE tfails INT; 

SELECT 
    SUM(CASE WHEN score >= 40 THEN 1 ELSE 0 END) AS passes, 
    SUM(CASE WHEN score < 40 THEN 1 ELSE 0 END) AS fails 
INTO tpasses, tfails 
FROM scores