2011-12-07 76 views
1

當我的客戶是某個客戶時,我只想選擇前50個記錄。否則,選擇所有記錄。我有以下(簡化版)。我在SQL 2000上。可以這樣做嗎?在使用TOP時在SELECT中使用case語句

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 

回答

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

不能使用case更改查詢的語法。在SQL Server 2005中您可以使用一個表達研究的頂部,而不是在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 
1

有關參數化頂端如何算?這仍然是一個醜陋的黑客,但至少你只需要一個查詢。

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.在這種情況下,這將無法正常工作。

+0

這是一個很好的解決方法 – Milox