【问题标题】:Avoid returning resultset under certain conditions避免在某些情况下返回结果集
【发布时间】:2012-05-20 10:15:26
【问题描述】:

我执行一个选择语句。如果结果集中的行数小于或等于某个数字,则返回选定的行。如果行数大于某个数,我不想返回任何行。

运行select并进行比较后,如果行数大于允许的行数,我执行:

SELECT TOP 0 NULL AS ID

我发现,最初选择的两条记录也与第二个结果集一起返回,该结果集包含一个名为 ID 的列,没有记录。显然,最初的选择语句仍在返回,我想避免这种情况。有什么办法吗?

编辑:忘了补充说我需要返回一个状态值,该值指示是否有超过允许的行数。这意味着我必须进行计数,并且希望在不必运行相同查询两次的情况下进行计数。因此,如果允许的最大行数为 25 但实际上存在零行,则返回状态 0。但如果行数大于 25,则不返回任何行,但将状态设置为 - 1.

【问题讨论】:

    标签: sql tsql


    【解决方案1】:

    对临时表进行选择,检查表中的行数并在选择中使用临时表或返回 0 行。

    -- Your query goes here
    select ID
    into #T
    from YourTable
    --where 
    
    -- Check the number of rows returned
    if (select count(*) from #T) <= 10
    begin
      -- Return the data
      select ID
      from #T
    end
    else
    begin
      -- Don't return anything
      select ID
      from #T
      where 0 = 1
    end
    
    drop table #T
    

    您也可以使用count(*) over() 在一个查询中完成。

    select ID
    from
      (
        select ID, count(*) over() as C
        from YourTable
        --where
      ) T
    where C <= 10
    

    或使用 CTE

    with C as
    (
      select ID
      from YourTable
      --where
    )
    select ID
    from C
    where (select count(*) from C) <= 10
    

    选择最适合您的需求或对您的数据表现最好的。

    更新
    返回行数的修改后的临时表版本。

    declare @MaxRows int
    set @MaxRows = 25
    
    declare @ActualRowCount int
    
    select top(@MaxRows+1) ID
    into #T
    from YourTable
    
    set @ActualRowCount = @@rowcount
    
    if @ActualRowCount = 0
    begin
      -- No rows returned
      select null as ID, 0 as [RowCount]
    end
    else
    if @ActualRowCount > @MaxRows
    begin
      -- Too many rows returned
      select null as ID, -1 as [RowCount]
    end
    else
    begin
      -- Return rows from temp table
      select ID, @ActualRowCount as [RowCount]
      from #T
    end
    
    drop table #T
    

    【讨论】:

    • 我忘了提一件事。在原始帖子中查看我的编辑。您的解决方案是正确的并且非常好,除了我需要返回一个指示是否有太多记录的状态。看来我必须运行第二个查询。还是我?
    • 添加了一个临时表版本,该版本至少返回一行包含行数信息。 -1 行太多。
    【解决方案2】:

    我假设您使用的是 SQL Server,因此您可以使用 @@ROWCOUNT(返回受最后一条语句影响的行数。 )

    所以这里有一个例子:

    SELECT ID FROM [YourTable] WHERE [Your Conditions]
    
    IF @@ROWCOUNT > [YourLimit]
      SELECT ID FROM [YourTable] WHERE 0=1 // return empty records
    ELSE
      SELECT ID FROM [YourTable] WHERE [Your Conditions]
    

    就是这样

    【讨论】:

    • 将首先返回或同时返回,因此总是会返回 first。不会吗?而 OP 询问如何返回一个或另一个。
    • 像 John 的解决方案一样,它需要运行两个查询。一个获取计数,另一个获取数据。可以只用一个查询(一次 Select 执行)来完成吗?
    【解决方案3】:

    将您的行数参数加载到变量中,然后 SELECT:

    DECLARE @rows INT;
    DECLARE @maxRows INT = 1000; --set your desired max value here
    SELECT @rows=COUNT(1) FROM [myTable];
    
    SELECT ID FROM [myTable]
    WHERE @rows <= @maxRows;
    

    当行数过多时,你要么得到一个空集,要么得到结果集

    【讨论】:

    • 不错的解决方案,除了它需要运行两个查询。一个获取计数,另一个获取数据。好像很浪费。如果只需要运行一个查询并且如果数量超过限制则返回行或不返回行,那就太好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 2012-02-03
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    相关资源
    最近更新 更多