是否可以使用T-SQL条件TOP子句?

时间:2010-06-24 07:39:03

标签: tsql

我想动态使用TOP或者不是这样......

SELECT @SomeNumber CASE WHERE 0 THEN TOP 5 COLUMNNAME
                        ELSE COLUMNNAME
                   END
FROM TABLE

8 个答案:

答案 0 :(得分:17)

我希望能够理解你的问题:如果传递@SomeNumber = 0,你想选择TOP 5行,否则选择所有可行的行

作为第一个直接实现,你可以做类似的事情

declare @SomeNumber as int

set @SomeNumber = 5
-- set @SomeNumber = 1

SELECT TOP (SELECT @SomeNumber) COLUMNNAME FROM MYTABLE

您可以更改参数值,以便拥有所需的行数


否则我建议你实现一个存储过程(也许你已经这样做了,否则你可以按照下面的步骤去做)

CREATE procedure [dbo].[TOPCLAUSE]

    -- clause parameter
    @SomeNumber as integer

AS

IF @SomeNumber = 0 
BEGIN
    SELECT TOP 5 COLUMNNAME FROM MYTABLE
END
ELSE
BEGIN
    SELECT COLUMNNAME FROM MYTABLE
END

GO

然后你可以打电话

exec [dbo].[TOPCLAUSE] 0

exec [dbo].[TOPCLAUSE] 1

我可能没有回答你的问题但请告诉我是否有帮助

答案 1 :(得分:4)

我认为你不能。

您可以使用动态SQL:

Declare @int int

set @int = 10

exec ('Select top '  + @int + ' * From Customers')

或者您可以设置rowcount

if (@someNumber != 0)
begin
set rowcount 5
end

select * From Customers

set rowcount 0

答案 2 :(得分:2)

我刚刚使用过这样的东西: -

Declare @SQL nvarchar(max), @Params nvarchar(max)
set @Params = N''
Set @SQL = N'SELECT ' + Cast(@SomeNumber as varchar) + ' CASE WHERE 0 THEN TOP 5 COLUMNNAME
                        ELSE COLUMNNAME
                   END
FROM TABLE'

exec sp_executesql @SQL, @Params

答案 3 :(得分:1)

简短的回答是否定的,不是你拥有它的方式。

但是,您可以使用IF来测试并运行其他查询:

IF (@SomeNumber = 0)
BEGIN
   SELECT TOP 5 ColumnName FROM Table
END
ELSE
BEGIN
   SELECT ColumnName FROM Table
END

答案 4 :(得分:1)

两个选项:条件SQL或动态SQL。

(1)有条件:

IF @SomeNumber = 0
    SELECT TOP 5 COLUMNAME FROM TABLE
ELSE
    SELECT COLUMNAME FROM TABLE

(2)动态:在varchar()中构建查询并将其传递给sp_execute

答案 5 :(得分:1)

另一个漏洞:使用带有row_number函数的子查询

DECLARE @DoTopJN AS bit

SET @DoTopJN = 0 -- or 1

SELECT X.Sequence
       X.COLUMNA
       --etc

FROM (SELECT ROW_NUMBER() OVER (ORDER BY Y.Code) AS Sequence
             ,Y.COLUMNA
             ,Y.COLUMNB
             -- etc.
      FROM   Y) X

WHERE ((@DoTopJN = 0) OR (X.Sequence = 1))  

答案 6 :(得分:0)

我不认为这是可能的,因为TOP不仅应用于列,而且应用于整行。您必须创建两个不同的select语句并将它们放在IF ELSE构造中。

答案 7 :(得分:0)

要更正SPE109的代码,请执行以下操作:

DECLARE @SomeNumber INT = 0
DECLARE @SQL nvarchar(max), @Params nvarchar(max)
set @Params = N''
SELECT @SQL = N'SELECT ' + CASE WHEN @SomeNumber = 0 THEN '' ELSE 'TOP ' + CAST(@SomeNumber as varchar) END + ' COLUMNNAME FROM TABLE'
exec sp_executesql @SQL, @Params