2012-05-20 110 views
6

我執行一條select語句。如果結果集中的行數小於或等於某個數字,則返回選定的行。如果行數大於某個數字,我想不返回任何行。避免在某些條件下返回結果集

運行選擇和做比較,如果行數比允許的行數時後,我執行:

SELECT TOP 0 NULL AS ID 

我發現了什麼,無論最初選擇的記錄還與第二個結果集一起返回,其中一列稱爲ID,並且沒有記錄。顯然,最初的select語句仍然被返回,我想避免這種情況。有什麼辦法嗎?

編輯:忘了補充說,我需要返回一個狀態值,指示是否有更多的行比允許的。這意味着我必須得到計數,並且寧願計數而不必運行相同的查詢兩次。因此,如果允許的最大行數是25,但實際上存在零行,那麼我返回的狀態爲0.但是,如果行數大於25,那麼我不返回任何行,但我將狀態設置爲 - 1。

回答

5

執行select into temp表,檢查表中的行數,並在select中使用temp表或返回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 
+0

我忘了提東西。在原始發佈中查看我的編輯。你的解決方案是正確的,非常好,除了我需要返回一個狀態指示是否有太多的記錄。看來我將不得不運行第二個查詢。或者我? – AndroidDev

+0

添加了一個臨時表版本,該版本至少返回一行包含行計數信息。 '-1'的行數太多。 –

1

我假設你使用的是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] 

這就是全部

+1

將返回第一或兩者,所以首先將永遠返回。它不會?而OP則詢問如何返回這個或另一個。 – abatishchev

+0

像John的解決方案一樣,它需要運行兩個查詢。一個獲取數據,另一個獲取數據。它可以只用一個查詢(單個選擇執行)來完成嗎? – AndroidDev

1

將您的行計數參數加載到變量中,然後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; 

你要麼得到一個空集時有太多的行,或將結果集

+0

不錯的解決方案,但它需要運行兩個查詢。一個獲取數據,另一個獲取數據。看起來像是浪費。如果只有一個查詢需要運行,並且如果該數字超出限制,則返回行或不包含行,那將會很好。 – AndroidDev