2011-03-12 82 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