2011-06-06 14 views
2

我有一個數據庫查詢「混合」的地位......數據庫查詢。如何捕捉單行

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

的狀態與對FOO條相關聯的狀態。 GUI顯示將爲每個foo顯示1行,並且如果針對該foo的所有bar1,bar2,bar3顯示覆選框,則狀態都爲1.並且如果爲該foo,則顯示一個未經檢查的chceckbox,狀態值bar1,bar2和bar3都是零。如果再次對於給定的富,不同的酒吧有不同的地位,我需要顯示一些其他的標記(一個問號,說)。

我對sql的知識不足以完成此任務。這可以在SQL中完成。它在Oracle中,如果這有所作爲。我想我可能不得不將它吸入Perl並檢查那裏的情況,但我對這個想法並不滿意。

回答

0

也許重組您的查詢來執行聯合而不是IN。

以這種方式

,你將有一個明確的值(唯一的每個被聯合select語句,會告訴你哪個值已匹配

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如果所有檢查

+0

這是聰明的。我喜歡。 – ErikE 2011-06-07 08:25:25

1

隨着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, 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 
0

如果設計師是聰明,bar1bar2bar3應該是2數字權力,因此可以應用於位運算符他們 - 那麼這將是微不足道的知道哪些特定bars的設置。

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

+0

我想你錯過了一些東西。這意味着每個foo/bar的狀態只能是0或1,但不會說bar(甚至bar的類型,儘管這個簡單的版本表明它是數字)的值。而不是看bar1等的值,你必須看看每一個與特定foo相關的狀態組合。 – 2011-06-07 08:46:27