微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

| 我有一个数据库查询...
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。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。