2013-04-03 11 views
7

Czy istnieje sposób, aby uruchomić instrukcję select z "wtedy" w przypadku serwera sql/instrukcji? (Muszę uruchomić podkwerendy z instrukcji then.) Nie mogę mieć tego w instrukcji where.wybierz podzapytanie wewnątrz, a następnie case, gdy instrukcja?

select 
    case @Group 
    when 6500 then (select top 10 * from Table1) 
    when 5450 then (select top 5 * from Table1) 
    when 2010 then (select top 3 * from Table1) 
    when 2000 then (select top 1 * from Table1) 
    else 0 
    end as 'Report' 
+0

Chcesz zwrócić 10 wierszy, 5 wierszy lub 3 wiersze itp. W jednej kolumnie? Nie jestem pewien, czy podążam. –

+0

To tylko przykłady tego, co muszę zrobić. Prawdziwe zapytania są znacznie dłuższe i nie są najlepsze. – Rainhider

Odpowiedz

2

Jedną z opcji jest, aby usunąć to z kwerendy i zrobić coś takiego:

declare @Numrows int; 
select @Numrows = (case @Group 
         when 6500 then 10 
         when 5450 then 5 
         when 2010 then 3 
         when 2000 then 1 
         else 0 
        end); 

select top(@NumRows) * 
from Table1; 

Można również zrobić to w ten sposób:

with const as (
     select (case @Group 
         when 6500 then 10 
         when 5450 then 5 
         when 2010 then 3 
         when 2000 then 1 
         else 0 
        end) as Numrows 
    ) 
select t.* 
from (select t.*, ROW_NUMBER() over() as seqnum 
     from table1 t 
    ) t cross join 
    const 
where seqnum <= NumRows; 

w tym przypadku, trzeba wylistuj kolumny, aby uniknąć uzyskania seqnum na liście.

Nawiasem mówiąc, zwykle przy użyciu top powinieneś także mieć order by. W przeciwnym razie wyniki są nieokreślone.

+0

cóż, podkwerendy są tylko przykładami wykonania zapytania wewnątrz instrukcji "then". Rzeczywiste zapytania, które mam zamiar uruchomić, zawierają kolumny i sumy oraz całą masę innych rzeczy. – Rainhider

+1

@PerryDay. . . Nie można tego zrobić za pomocą pojedynczej instrukcji SQL. –

+0

ok. tego właśnie szukałem. dzięki! – Rainhider

2

Nie możesz mieć SELECT w SELECT. Możesz użyć IF ... ELSE chociaż np.

IF @Group = 6500 
    select top 10* from Table1 AS Report 
ELSE IF @Group = 5450 
    select top 5* from Table1 AS Report 
ELSE IF @Group = 2010 
    select top 3* from Table1 AS Report 
ELSE IF @Group = 2000 
    select top 1* from Table1 AS Report 
1

@Gordon ma już odpowiedź. To tylko druga opcja. Możesz użyć zapytania dynamicznego.


declare @query varchar(max) 
declare @Group int 
set @query = '' 

if @Group = 6500 
    set @query = 'select top 10 * from table1' 
if @Group = 5450 
    set @query = 'select top 5 * from table1' 
if @Group = 2010 
    set @query = 'select top 3 * from table1' 
if @Group = 2000 
    set @query = 'select top 1 * from table1' 

exec(@query) 
+0

to kompilacja bez błędu, ale nie wyświetla wyników zapytania. Potrzebuję go, żeby pokazać wyniki. – Rainhider

+0

Musisz podać wartość zmiennej Group, np. Set @Group = 6500, inaczej zapytanie będzie puste. – ljh

Powiązane problemy