использование оператора case в SELECT при использовании TOP - PullRequest
1 голос
/ 07 декабря 2011

Я хочу выбрать только первые 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 ]

1 голос
/ 07 декабря 2011

Вы не можете использовать 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 голос
/ 08 декабря 2011

Как насчет параметризации 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. В этом случае это не будет работать.

1 голос
/ 07 декабря 2011

Как будто вы не можете этого сделать!

Но вы можете сделать это с помощью операторов 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...