查询以根据所有列值获取不同的值

时间:2015-06-24 16:21:47

标签: mysql

我有一个带有状态列的表任务状态值可以是0,1或2.

我需要实现以下逻辑:

  • 如果状态中的任何值为0,则答案为0.
  • 如果所有值均为2,则结果为2.
  • 否则结果就是一个。

现在我正在使用3个查询进行此操作。

a) SELECT status FROM tasks
b) SELECT status FROM tasks WHERE status = 2;
c) SELECT status FROM tasks WHERE status = 0

所以a)用于获取总行数。然后我将它与b)给出的行数进行比较。如果匹配则答案是2.如果他们不这样做,我会查询c)。如果它是非空的,则答案为0,否则答案为1.

有没有办法为此编写单个查询?或者有更好的方法吗?

3 个答案:

答案 0 :(得分:1)

您可以使用条件聚合执行此操作:

SELECT CASE 
          WHEN s0 >= 1 THEN 0
          WHEN sAll = s2 THEN 2
          ELSE 1
        END
FROM (        
SELECT COUNT(*) AS sAll,
       COUNT(CASE WHEN status = 0 THEN 1 END) AS s0,
       COUNT(CASE WHEN status = 2 THEN 1 END) AS s2
FROM tasks ) t

子查询执行应用业务逻辑所需的所有计数。外部查询只使用此信息来生成所需的结果。

从您的描述中有点不清楚CASE中的第一个条件是否优先于第二个条件。如果没有,那么只需切换两个WHEN的位置。

答案 1 :(得分:1)

尝试:

SELECT MIN(status) FROM tasks;

- 因为当所有状态值都是2时,最小值将是2,当任何值为0时,最小值将为0,否则最小值将为1.

答案 2 :(得分:0)

使用以下

 SELECT (case 
when ((SELECT count(*) FROM tasks WHERE status = 0)>0) then 0 
when ((SELECT count(*) FROM tasks WHERE status = 2)=(SELECT count(*) FROM tasks)) then 2
else 1 end)  AS countOfStatus