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

时间:2011-06-06 21:08:44

标签: sql database perl oracle

我有一个数据库查询......

select foo, bar, status 
    from mytable 
    where bar in (bar1, bar2, bar3);

状态是与foo-bar对关联的状态。对于每个foo,GUI显示将显示1行,并且如果对于该foo的所有bar1,bar2,bar3,则应显示选中复选框,状态均为1.如果对于该foo,则显示未选中的chceckbox状态值bar1,bar2和bar3均为零。如果,对于给定的foo,不同的条形状具有不同的状态,我需要显示一些其他标记(例如,问号)。

我对sql的了解还不足以完成这项任务。这可以在sql中完成。它在Oracle中,如果这有所不同。我想我可能不得不把它吮吸到perl并检查那里的情况,但我对这个想法不满意。

5 个答案:

答案 0 :(得分:1)

在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;如果选中某些状态,则结果状态值为1;如果全部选中,则结果状态值为2

答案 1 :(得分:1)

使用CTE提供样本数据,行状态中的0和1的不同组合给出不同的输出值:

with tmp_tab as (
    select 'foo1' as foo, 'bar1' as bar, 0 as status from dual
    union
    select 'foo1' as foo, 'bar2' as bar, 0 as status from dual
    union
    select 'foo1' as foo, 'bar3' as bar, 0 as status from dual
    union
    select 'foo2' as foo, 'bar1' as bar, 0 as status from dual
    union
    select 'foo2' as foo, 'bar2' as bar, 1 as status from dual
    union
    select 'foo2' as foo, 'bar3' as bar, 0 as status from dual
    union
    select 'foo3' as foo, 'bar1' as bar, 1 as status from dual
    union
    select 'foo3' as foo, 'bar2' as bar, 1 as status from dual
    union
    select 'foo3' as foo, 'bar3' as bar, 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

答案 2 :(得分:0)

或许重构您的查询以执行联合而不是IN。

以这种方式,您将拥有一个显式值(每个联合的select语句都是唯一的,它将告诉您哪个值已匹配。

答案 3 :(得分:0)

如果设计师很聪明,bar1bar2bar3应该是2的数字幂,那么可以将逐位运算符应用于它们 - 那么知道它将是微不足道的设置了哪个bars

答案 4 :(得分:0)

我假设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, 0, 'unchecked', 3, 'checked', 'something else' )
  FROM ( SELECT foo, SUM( status ) AS sum_status
           FROM mytable
          WHERE bar in (bar1, bar2, bar3)
          GROUP BY foo )

同样,这假设状态只能是0或1。