2014-09-10 2 views
1

У меня есть ситуация, когда иногда выбирайте строки по порядку или иногда произвольно выбирайте n строк.Выберите верхний n или * на основе условия SQL

Так что я пытался сделать это в одном запросе, как этот

declare @rand int 
set @rand = 0 

select top (case @rand when 0 then 1000 else @rand end) * 
from MyQuestion 
where PackageID = 10 
order by sequence 

Это работает отлично, как и в моем плане. Но если общее число строк больше 1000, то это не сработает. Тогда да, если я укажу 10000, которые будут работать в этом случае. Но это не оптимально, я думаю. Поэтому я ищу решение, где я могу извлечь все строки без какого-либо числа, указанного или просто, что следует игнорировать верхнюю часть и он будет получать все строки, когда @rand является 0

проблема заказа

Другим вопросом, в тот же запрос, когда требуется случайный выбор.

Так что я изменил в запросе этого пути для случайного выбора, когда @rand имеют некоторые значения в нем

declare @rand int 
set @rand=0 

select top (case @rand when 0 then 1000 else @rand end) * 
from MyQuestion 
where PackageID = 10 
order by (case @rand when 0 then sequence else NEWID() end) 

Но выдает ошибку говоря

Операнда типа столкновение: UniqueIdentifier несовместима с междунар

Таким образом, мой сценарий состоит в том, чтобы случайным образом выбирать строки на основе переменной @rand или завершить ее в порядке, основанном на столбце последовательности (упорядоченном).

+1

Почему вы не пишете два разных запроса и не используете код приложения для выбора подходящего? Это может быть проще. –

+0

В следующий раз, пожалуйста, не редактируйте свой вопрос, чтобы сделать его совершенно новым с совершенно новым запросом. Мой ответ ниже был * полным * ответом на данный вопрос; но теперь, когда ваш вопрос изменился, другие ответы, которые люди предоставили, теперь лучше, и мой ответ неполный - по моей вине. – ErikE

ответ

0

Не существует штрафа за производительность при определении очень большого числа для предложения TOP, даже если количество строк намного меньше. Вы можете просто использовать максимальное значение для типа данных int, 2147483647 и идти своим весельем.

Механизм запросов, как только он определяет, что все входы исчерпаны, прекратит выдавать строки и запрос завершится и вернет результат.

UPDATE - Полностью измененный вопрос

Поскольку sequence является ИНТ колонка, она не совместима с результатом NewID(), который является uniqueidentifier (GUID).Попробуйте это:

ORDER BY 
    CASE @rand WHEN 0 THEN Sequence ELSE NULL END, 
    CASE @rand WHEN 0 THEN NULL ELSE NewID() END 
+0

Спасибо, босс, Если так, это очищает мое беспокойство. Но любезно проверьте Редактирование, которое я сделал по вопросу. –

0

вы могли бы использовать динамический запрос, если вы хотите, как этот

DECLARE @Query NVARCHAR(1000) 
DECLARE @Rand int 

set @Rand=0 

if(@Rand=0) 
BEGIN 
    SET @Query='*' 
END 
ELSE 
BEGIN 
    SET @Query='top '+CAST(@Rand AS NVARCHAR)+' *' 
END 

SET @Query= 'SELECT '[email protected]+' FROM MyQuestion WHERE PackageID=10 ORDER BY sequence' 

exec sp_executesql @Query 

или вы можете сделать это:

declare @rand int 
set @rand=0 
select top (case @rand when 0 then (SELECT COUNT(*) FROM MyQuestion) else @rand end) * 
from 
MyQuestion where 
PackageID=10 order by sequence 

Насколько ваша проблема упорядочения касается, вы можете ввести некоторый случайный новый столбец с постоянным значением и использовать его в своем заказе по предложению, например следующий запрос, если вы не хотите, чтобы порядок был:

SELECT * FROM 
(
    SELECT *, your_New_Random_column=0 
    FROM tbl_Securities 
) d 
ORDER BY (case @rand when 0 then ID else your_New_Random_column end) DESC 

Опять же, динамический запрос может работать, а

+0

Синтаксис, который вы представили в своем конечном блоке кода, не будет работать. – ErikE

+0

О, мой плохой ... Не видел этого, Сделал коррекцию – Codeek

1

Максимальное значение верхней, которая может быть указана в 9223372036854775807 (максимальное значение BIGINT) для SQL Server 2012 года и 2147483647 (максимальное значение INT) для SQL сервер 2008

Так что, если вы измените ваши запросы

declare @rand bigint 
set @rand=0 
select top (case @rand when 0 then 9223372036854775807else @rand end) * from MyQuestion where 
PackageID=10 order by sequence 

это даст вам все строки, если параметр @rand имеет значение равным 0.

ссылка select TOP (all)

заказ по вопросу: Здесь вы пытаетесь сортировать по значению, которое не является действительным и дает погрешность в результаты могут быть отсортированы на основе имени столбца, используемого в списке выбора или с помощью неотрицательное целое число, представляющее позицию столбца в списке выбора.

Перейдите по ссылке для получения более подробной информации http://msdn.microsoft.com/en-IN/library/ms188385.aspx

из приведенного выше ссылки order_by_expression: Определяет столбец или выражение, на котором для сортировки набора результатов запроса. Столбец сортировки может быть указан как псевдоним имени или столбца или неотрицательное целое число, представляющее позицию столбца в списке выбора. Можно указать несколько столбцов сортировки. Имена столбцов должны быть уникальными. Последовательность столбцов сортировки в предложении ORDER BY определяет организацию отсортированного набора результатов. То есть набор результатов сортируется по первому столбцу, а затем упорядоченный список сортируется по второму столбцу и так далее. Названия столбцов, указанные в предложении ORDER BY, должны соответствовать столбцу в списке выбора или столбцу, определенному в таблице, указанной в предложении FROM, без каких-либо двусмысленностей.

+0

Спасибо, помощник .. Но не могли бы вы проверить изменение, которое я сделал по вопросу ... –

+0

Порядок может быть сделан на основе имени столбца в вашей таблице, здесь вы указываете NEWID(), который дает ошибку. Используйте подходящее название столбца для заказа – Satyajit

+0

. Дорогой друг, используя newid() для случайного порядка. –

Смежные вопросы