2017-03-16 88 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