选择TOP(全部)

app*_*orm 24 sql-server

declare @t int
set @t = 10
if (o = 'mmm') set @t = -1
select top(@t) * from table
Run Code Online (Sandbox Code Playgroud)

如果我一般想要10行,但很少全部.

我知道我可以通过"SET ROWCOUNT"来做到这一点.但是有一些变量数,比如-1,导致TOP产生所有元素.

Mar*_*ith 31

可以传递给的最大可能值TOP就是9223372036854775807你可以传递它.

下面我使用max signed bigint的二进制形式,因为只要你知道基本模式并且bigint是8个字节就更容易记住.

declare @t bigint =  case when some_condition then 10 else  0x7fffffffffffffff end;

select top(@t) * 
From table
Run Code Online (Sandbox Code Playgroud)

如果你没有order by子句,那么前10名将只是10和依赖于优化.

如果你确实有一个order by子句来定义前10个和一个支持它的索引,那么上面查询的计划应该适用于任何可能的值.

如果您没有支持索引并且计划显示排序,则应考虑拆分为两个查询.

  • 虽然对我不正确但可读性很重要,我讨厌在代码中看到像这样的大数字. (2认同)
  • @JonH - 是的.遗憾的是,没有像@@ BIG_INT_MAX`这样的命名常量.如果实际查询与2个非常相似的版本相比,它可以增强可读性. (2认同)
  • @sankaras - 为什么要打扰?那将需要两个查询.一个得到计数然后一个得到结果. (2认同)

Jon*_*onH 5

我不确定我理解你的问题.

但是如果你有时想要TOP而其他时候不要只使用if/else构造:

if (condition)
  'send TOP
  SELECT TOP 10 Blah FROM...
else
  SELECT blah1, blah2 FROM...
Run Code Online (Sandbox Code Playgroud)

  • 这是复制粘贴...我认为它不是最好的做法 (4认同)
  • @ dynback.com SQL是一种高级语言.条件SQL语句基本上将DRY原则抛出窗口.这不应该被忽略,因为如果正确执行,重复SQL中的条件语句实际上可能非常有用. (2认同)