sql server—从列表中选择或选择sql中的所有值

68bkxrlz  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(449)

sql server问题-我正在尝试从一个名为budget的表中获取一些记录。使用的过滤器是成本中心(costc)。我已经创建了这样的查询,如果有多个costc,那么它将是

select costc,description,budget from BUDGET where costc IN ('c1',c2',c3')

但我还需要一个功能,以便在没有列表的情况下,costc上的过滤器应该查找所有(*)成本中心。

jyztefdp

jyztefdp1#

一个选项使用 union all 以及 not exists :

select costc, description, budget 
from budget 
where costc in ('c1', 'c2', 'c3')
union all
select costc, description, budget 
from budget
where not exists (select 1 from budget where costsc in ('c1', 'c2', 'c3'))

也可以使用窗口功能:

select costc, description, budget 
from (
    select 
        b.*, 
        max(case when costc in ('c1', 'c2', 'c3') then 1 else 0 end) over() has_match
    from budget b
) b
where costc in ('c1', 'c2', 'c3') or has_match = 0
ev7lccsx

ev7lccsx2#

您可以从@gmb的答案重写union:

select costc, description, budget 
from budget 
where costc in ('c1', 'c2', 'c3')
or not exists (select 1 from budget where costc in ('c1', 'c2', 'c3'))

由此产生的执行计划可能与工会的执行计划相同。
或者,如果生成一个所有costc的列表比较便宜:

select something
from manymanyjoinsquery 
where costc in 
(  select costc 
        from budget 
        where costc in ('c1', 'c2', 'c3')
        or not exists (select 1 from budget where costsc in ('c1', 'c2', 'c3'))
)

相关问题