2016-01-20 161 views
0

我有一個sql server 2008表,我們說「alpha」,有三列。他們是[ID],[col1]和[col2]。Where Case Statement trouble

id|col1|col2 
1 |X |john1X| 
1 |Y |john1Y| 
1 |Z |john1Z| 
2 |X |john2| 
3 |Y |john3| 
4 |X |john4| 

每個ID可能有多個條目。如果col1包含'X',我希望顯示該行。如果col1中沒有'X'的ID,我想選擇'Y'。否則,行不應該出現。

對於上面的示例數據,預期的輸出將會低於。

id|col1|col2 
1 |X |john1X| 
2 |X |john2| 
3 |Y |john3| 
4 |X |john4| 

我一直試圖讓這個代碼工作,

select * from alpha 
where col1 = case 
      when exists(select * from alpha where col1 = 'X') then 'X' 
      else 'Y' 
      end 

但是我一直得到下面的輸出不管我怎麼重寫代碼。

id|col1|col2 
1 |X |john1X 
2 |X |john2 
4 |X |john4 
+0

通過身份證也給你的子查詢 – techspider

回答

1

你缺少你的子查詢的條款......該生產線

when exists(select * from alpha where col1 = 'X') then 'X' 

應該

when exists(select * from alpha b where col1 = 'X' and b.id = alpha.id) then 'X' 

請注意,我在你的子查詢中增加了一個別名錶,這樣就可以匹配用主錶針對子查詢表的ID字段。

+0

謝謝,這就是我的查詢中缺少的! – kjh23

2

你可以用row_number()做到這一點:

select a.* 
from (select a.*, 
      row_number() over (partition by id 
           order by col1 
           ) as seqnum 
     from alpha 
     where col1 in ('X', 'Y') 
    ) a 
where seqnum = 1; 

注:此特定邏輯的工作方式,因爲 'X' < 'Y' 指定。您可以使用case語句來獲得更一般的排序或更多的值。