使用TOP时在SELECT中使用case语句

时间:2011-12-07 17:13:36

标签: tsql

当我的客户是某个客户时,我想只选择前50个记录。否则选择所有记录。我有以下(简化版)。我在SQL 2000上。可以这样做吗?

DECLARE @custnum AS VARCHAR(7)
SET @custnum = '1234567'
SELECT CASE @custnum 
        WHEN '1234567' THEN [TOP 50 DISTINCT]
        ELSE [DISTINCT]
        END
        item1, item2
FROM myTable
WHERE myCust = @custnum

3 个答案:

答案 0 :(得分:1)

就像你不能做到的那样!

但你可以使用IF ELSE语句来完成它。

伪码:

IF @custnum = '1234567'
SELECT [TOP 50 DISTINCT]
        item1, item2
FROM myTable
WHERE myCust = @custnum
ELSE
SELECT [DISTINCT]
        item1, item2
FROM myTable
WHERE myCust = @custnum

答案 1 :(得分:1)

您无法使用case更改查询的语法。在SQL Server 2005中,您可以使用experssion作为top,但不能使用SQL Server 2000。

您必须进行两次单独的查询:

declare @custnum varchar(7)
set @custnum = '1234567'

if (@custnum = '1234567') begin
  select top 50 distict item1, item2
  from myTable
  where myCust = @custnum
end else begin
  select distinct item1, item2
  from myTable
  where myCust = @custnum
end

答案 2 :(得分:1)

参数化TOP计数怎么样?它仍然是一个丑陋的黑客,但至少你只需要一个查询。

DECLARE @custnum AS VARCHAR(7)
DECLARE @topcount as int

SET @custnum = '1234567'
SELECT @topcount = CASE WHEN @custnum = '1234567' THEN '50' ELSE 2147483647 END
SELECT DISTINCT TOP (@topcount) 
    item1, item2
FROM myTable
WHERE myCust = @custnum

编辑:对不起,刚刚意识到这是针对SQL Server 2000的。在这种情况下,这不会起作用。