我有一个带有状态列的表任务状态值可以是0,1或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.
有没有办法为此编写单个查询?或者有更好的方法吗?
答案 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