如果第一次选择返回 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 中找不到匹配项,则提供要加入的备用列