2016-11-30 56 views
0

我需要通過不同的連接進行篩選,以選擇列表中的前4個,但是由於不一致,它們不都始於1,有些存在間隙。在SELECT中使用CASE篩選出NULL記錄

我有以下代碼來填充第一個4列表中的

COALESCE (CASE 
WHEN 1 IS NOT NULL THEN 1 END, 
WHEN 2 IS NOT NULL THEN 2 END, 
WHEN 3 IS NOT NULL THEN 3 END, 
WHEN 4 IS NOT NULL THEN 4 END, 
WHEN 5 IS NOT NULL THEN 5 END, 
WHEN 6 IS NOT NULL THEN 6 END 
) AS COL1 

這工作正常,問題是當我去做第二列。它返回相同的值,因爲我無法與之前的COL1進行比較,因爲它是別名。

任何幫助將是偉大的!

+0

只是使用量搜索到每個第4參加這樣,如果他們開始用1或沒有它不會不要緊,限制條件。 –

+2

帶查詢的樣本數據以及預期的結果。你可以使用像'row_number over(by ... by order by ....)作爲RN'的窗口函數來生成一個行號,然後過濾'其中RN <= 4 ...' – xQbert

回答

1

在SQL Server中,這與case語句幾乎不可行 - 它們會變得非常複雜。

取而代之,您可以將數據轉化爲行,然後將數據重新聚合到單獨的列中,一路篩選出NULL s。下面是使用outer apply一個例子:

select . . ., x.* 
from . . . outer apply -- all your joins go here 
    (select max(case when seqnum = 1 then col end) as col_1, 
      max(case when seqnum = 2 then col end) as col_2, 
      max(case when seqnum = 3 then col end) as col_3, 
      max(case when seqnum = 4 then col end) as col_4    
     from (select col, row_number() over (order by ordering) as seqnum 
      from (values (t1.col, 1), (t2.col, 2), . . . 
       ) v(col, ordering) 
      where col is not null 
      ) v 
    ) x