我执行一个select语句。如果结果集中的行数小于或等于某个数字,则返回所选行。如果行数大于某个数字,我想不返回任何行。
运行select并进行比较后,如果行数大于允许的行数,我执行:
SELECT TOP 0 NULL AS ID
我发现最初选择的记录也与第二个结果集一起返回,其中一个列名为ID且没有记录。显然,初始select语句仍然被返回,我想避免这种情况。有什么办法吗?
编辑:忘记添加我需要返回一个状态值,指示是否有多于允许的行。这意味着我必须得到计数,并且更愿意拥有计数,而不必两次运行相同的查询。因此,如果允许的最大行数为25但实际上存在零行,则返回状态为0.但是如果行数大于25,那么我不会返回任何行但是我设置了状态到-1。
答案 0 :(得分:5)
选择临时表,检查表中的行数,并使用select表中的临时表或返回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 :(得分: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]
这就是全部
答案 2 :(得分: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;
当行数太多或结果集
时,您将获得一个空集