如果第一次选择返回 0 计数,则返回备用视图结果

Posted

技术标签:

【中文标题】如果第一次选择返回 0 计数,则返回备用视图结果【英文标题】:Return alternate view results if first select returns 0 count 【发布时间】:2017-03-16 16:44:15 【问题描述】:

我在 SQL Server 视图中有相当长的 SQL 选择。

但是,我想要一个条件,这样如果没有返回任何行,那么它会更改 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

我怎样才能在视图中解决这个问题?

提前致谢

【问题讨论】:

您可以使用or 条件.. WHERE a = b or a = c 但如果 a = b 有值,我不想返回 a = c 【参考方案1】:

使用common table expression 和not 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

【讨论】:

这种方法看起来应该可行。 CTE 是否会对性能造成很大影响或有什么影响? @DaRoGa cte 本身没有性能损失,正如这里使用的那样,它仅用于通过不重复 not exists() 中的主查询来保持查询 DRY。这将取决于查询本身的性能。使用带有递归的 cte 可能会导致性能下降,但此处并非如此。【参考方案2】:

选择这两个集合并使用RANK 将具有a = b 的集合优先于具有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 的记录。

【讨论】:

以上是关于如果第一次选择返回 0 计数,则返回备用视图结果的主要内容,如果未能解决你的问题,请参考以下文章

如果数据库中存在表,则返回视图

如何只返回一列的计数结果?

如果在 Hive SQL 中找不到匹配项,则提供要加入的备用列

如果从不同的视图控制器按下返回,则重新加载而不重新加载。迅速

SQL - 如果结果集包含多于一行,则返回最新(id)结果

第一个只出现一次的字符