Sql 仅当存在时选择specific,否则返回ALL

Sql 仅当存在时选择specific,否则返回ALL,sql,tsql,Sql,Tsql,如何写入WHERE cluase以返回符合条件的行,如果没有此类记录,则应返回表中的所有记录?使用UNION all: select t.* from table t where condition union all select t.* from table t cross join (select count(*) cnt from table where condition) c where c.cnt=0 或者(效率更高): 替换条件使用您所在的条件 >您可以在T-SQL 中考虑的

如何写入WHERE cluase以返回符合条件的行,如果没有此类记录,则应返回表中的所有记录?

使用UNION all:

select t.* from table t where condition
union all
select t.* from table t cross join (select count(*) cnt from table where condition) c
where c.cnt=0
或者(效率更高):


替换<代码>条件使用您所在的条件

>您可以在T-SQL 中考虑的一种方法是使用<代码> @ @ RoeCube < /Cord>来确定是否需要返回所有行。

这样做的好处是您可以得到两个单独的执行计划,其中一个仅针对您的第一个
存在
标准进行了优化,并且如果大多数结果都满足
存在
条件,那么这将是有益的

select <columns>
from <table>
where <condition>

if @@rowcount=0
begin
  select <columns>
  from <table>
end
选择
从…起
哪里
如果@@rowcount=0
开始
挑选
从…起
结束
一种方法是:

SELECT *
FROM Person
WHERE 
  Name = 'John' 
  OR NOT EXISTS(SELECT null FROM Person WHERE Name = 'John')

我不喜欢它,因为评论中提到的所有这些好的理由。如果我把这个需求作为我正在创建的系统的一部分交给我,我可能会检查这个需求的需求;如果您使用以下条件查询表的类型:“亲爱的用户,我们找不到您的John,因此系统中还有42.7亿用户,分页大小为100”

,那么从表中选择所有行很少有用:

WHERE (
           ISNULL(@variable, '') = '' 
           OR @variable = [Column]
           )
不完全是我上面描述的,但如果条件不满足,它将返回所有记录。然而,在这种情况下,条件将为变量赋值。

1方法

  Where (  ISNULL(@Param,'')='' OR  ColumnName  = @Param)
第二条路

   WHERE ( ColumnName =CASE WHEN @Param IS NULL THEN ColumnName 
                        ELSE @Param
                        END)
第三条路

    WHERE (@Param =''  OR @Param =ColumnName) 

我建议使用
不存在的CTE

with cte as (
      select t.*
      from t
      where . . .
     )
select *
from cte
union all
select *
from t
where not exists (select 1 from cte);

任何此类查询都需要在表上进行两次传递(一次确定表中是否有行,另一次返回所需行),因此如果更容易,您还可以执行
if EXISTS(…)
并编写两个查询。当然,您可以通过将该条件推到
中一次完成,但请注意,这很可能会导致性能下降。最有效的方法是使用一个查询选择与所需条件匹配的行,然后使用一个单独的查询返回所有不匹配的行。到目前为止,您得到了什么?哪个是数据库?@CaiusJard是的,这是一个打字错误。它应该为null而不是0,或者使用sum而不是count。这有一个相当大的缺点,即返回1或2行集,客户机需要知道如何处理这些行集。有些是透明合并的,但大多数库/客户机代码只处理第一行集,就这样完成了。@Jeroenmoster,是的-提出的问题不是特别清楚标准的复杂性。我不认为这是一个“简单”的例子。如果ctiteria特别昂贵,而不是一个简单变量的等式,例如,一个存在于多个联接和过滤之上,那么处理第二个结果集的性能权衡可能是值得的,这通常取决于用例。我同意。但在这种特定情况下,select返回的行是存储过程的游标范围,该存储过程需要遍历特定的表或配置表中的所有现有行。我打算提出类似的建议,但不确定“前端”是否知道它需要所有行还是“某些行”-要求如下“前端只知道它需要‘一些行’,但如果没有行符合它的要求,则应该给它所有行”。您可以将其简化为
,其中[Column]=@variable或@variable为NULL
with cte as (
      select t.*
      from t
      where . . .
     )
select *
from cte
union all
select *
from t
where not exists (select 1 from cte);