2017-03-16 121 views
2

我在SQL Server視圖中有相當長的SQL選擇。如果第一個select返回0返回替代視圖結果計數

但是,我想要一個條件,所以如果沒有行返回,那麼它會改變where子句。

查詢概述如下:

SELECT COL1, COL2, COL3, COL4............(15 columns) 
FROM TABLE1 inner join TABLE2 ON t1 = t2 (10 tables) 
WHERE a = b 

所以我想,是,如果上面的查詢返回0行,然後返回結果:

SELECT COL1, COL2, COL3, COL4............(15 columns) 
FROM TABLE1 inner join TABLE2 ON t1 = t2 (10 tables) 
WHERE a = c 

我怎樣才能在一個視圖中去看這個?

在此先感謝

+0

你可以ü如果a = b或a = c'' WHERE a = b或a = c' –

+0

但是我不想返回a = c如果a = b有值 – DaRoGa

回答

1

使用common table expressionnot exists()

;with cte as (
    /* big query here without where clause of `a = b` or `a = c` */ 
) 
select * 
from cte 
where a = b 
    or (a = c 
    and not exists (select 1 from cte where a = b) 
    ) 

例如:

create table t (value int); 
insert t values (0),(1),(3),(4),(5); 
with cte as (
    select * 
    from t 
) 
select * 
from cte 
where value = 2 
    or (value = 3 
    and not exists (select 1 from cte where value=2) 
    ) 

回報3

rextester演示:http://rextester.com/NDC30620

+0

這種方法看起來應該起作用。 CTE會有很大的性能下降嗎? – DaRoGa

+0

@DaRoGa cte本身並沒有性能問題,因爲它只用於通過不重複'not exists()'中的主查詢來保持查詢DRY。這將取決於查詢本身的性能。使用cte與遞歸是可能與性能命中有關的,但這不是這種情況。 – SqlZim

1

選擇兩套並優先爲a = b在使用RANK一個具有a = c之一:

SELECT COL1, COL2, COL3, COL4............(15 columns) 
FROM (
    SELECT RANK() OVER (ORDER BY CASE 
            WHEN a = b THEN 1 
            ELSE 2 
           END) AS rnk, 
      COL1, COL2, COL3, COL4............(15 columns) 
    FROM TABLE1 inner join TABLE2 ON t1 = t2 (10 tables) 
    WHERE a IN (b, c)) AS t 
WHERE t.rnk = 1 

如果不存在有a = b一些記錄,然後查詢將挑選正是這些記錄,否則將返回a = c