数据库查询如何捕获单行上的“混合”状态

问题描述

| 我有一个数据库查询...
select foo,bar,status 
    from mytable 
    where bar in (bar1,bar2,bar3);
该状态是与对foo-bar关联的状态。 GUI显示屏将为每个foo显示1行,并且如果该foo的所有bar1,bar2,bar3的状态均为1,则应该显示一个选中复选框;如果该foo的状态值为1,则应显示一个未选中的chceckbox。 bar1,bar2和bar3都为零。如果再次针对给定的foo,不同的小节的状态不同,则我需要显示其他标记(例如问号)。 我对sql的了解不足以完成此任务。可以在sql中完成吗?在Oracle中,如果有所不同。我想可能要把它吸进perl并检查那里的状况,但是我对这个想法不满意。     

解决方法

        在T-SQL中,我可以这样做:
create table mytable (foo nvarchar(128),bar nvarchar(128),status int)
go
select foo,(MAX(status) + MIN(status)) as status 
from mytable 
group by foo
然后在客户端应用中,如果所有状态都未选中,则结果状态值将为0;如果某些状态为选中状态,则状态值将为2;如果所有状态均已选中,则状态值为2。     ,        使用CTE提供样本数据时,行状态中零和一的不同组合会提供不同的输出值:
with tmp_tab as (
    select \'foo1\' as foo,\'bar1\' as bar,0 as status from dual
    union
    select \'foo1\' as foo,\'bar2\' as bar,\'bar3\' as bar,0 as status from dual
    union
    select \'foo2\' as foo,1 as status from dual
    union
    select \'foo2\' as foo,0 as status from dual
    union
    select \'foo3\' as foo,1 as status from dual
    union
    select \'foo3\' as foo,1 as status from dual
)
select foo,case
        when sum(status) = 0 then \'Unchecked\'
        when sum(status) = count(bar) then \'Checked\'
        else \'Unknown\'
    end as status
from tmp_tab
where bar in (\'bar1\',\'bar2\',\'bar3\')
group by foo;

FOO  STATUS
---- ---------
foo1 Unchecked
foo2 Unknown
foo3 Checked
    ,        也许重组查询以执行联合而不是IN。 这样,您将拥有一个明确的值(对于每个联合的选择语句都是唯一的,它将告诉您已匹配了哪个值。     ,        如果设计者很聪明,则
bar1
bar2
bar3
应该是2的数字幂,因此可以对它们应用按位运算符-那么知道设置the6ѭ中的哪一个将是微不足道的。     ,        我假设bar1 / 2/3只能为0或1:
SELECT foo,bar,CASE WHEN ( bar1 + bar2 + bar3 = 3 ) THEN \'checked\'
            WHEN ( bar1 + bar2 + bar3 = 0 ) THEN \'unchecked\'
            ELSE \'something else\' END
  FROM mytable 
 WHERE bar in (bar1,bar2,bar3);
还是我错过了什么? 编辑:看来我最初误解了问题。我认为这会起作用。
SELECT foo,DECODE( sum_status,\'unchecked\',3,\'checked\',\'something else\' )
  FROM ( SELECT foo,SUM( status ) AS sum_status
           FROM mytable
          WHERE bar in (bar1,bar3)
          GROUP BY foo )
同样,这假设状态只能为0或1。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...