2011-07-07 20 views
17

Ho la seguente query che restituisce righe in base a una virgola listaSQL - ordina per lista

Select * from Table where RecordID in (22,15,105,1,65,32) 

separati Vorrei che i risultati di questa query per tornare nell'ordine delle identificazioni nella lista . È possibile con SQL?

Grazie in anticipo

+0

Cosa database SQL sistema, o hai bisogno di qualcosa di portatile? –

risposta

10

Se è necessario l'output di apparire in un ordine particolare, allora avete bisogno di specificare che l'ordine, utilizzando qualcosa che il server può ordinare. Non sapendo a quale motore si sta lavorando, lo schema generale sarebbe quello di creare una tabella temporanea o utilizzare i costruttori di set di righe per associare ogni ID di record con il suo ordinamento desiderato.

E.g. (SQL Server)

declare @T table (RecordID int,Position int) 
insert into @T (RecordID,Position) 
select 22,1 union all 
select 15,2 union all 
select 105,3 union all 
select 1,4 union all 
select 65,5 union all 
select 32,6 

select * from Table t inner join @T t2 on t.RecordID = t2.RecordID order by t2.Position 
+0

Grazie mille, funziona a meraviglia. – twsJames

0

Sì. Aggiungi la clausola ORDER BY recordedid alla fine.

+2

Non penso di averlo capito: vuole lo * stesso * ordine della domanda – Bohemian

+0

hai ragione, questo non era chiaro per me. – nabuchodonossor

-3

Usa ORDER BY contro il RecordID

Select * from Table where RecordID in (22,15,105,1,65,32) ORDER BY RecordID 
+0

Hey Talha, vorrei che i registri fossero ordinati nello stesso ordine della lista. per esempio. Record 1 = id 22, Record 2 = id 15 ecc. È possibile – twsJames

14
select * from Table 
where RecordID in (22,15,105,1,65,32) 
order by (
    case RecordID 
     when 22 then 1 
     when 15 then 2 
     when 105 then 3 
     when 1 then 4 
     when 65 then 5 
     when 32 then 6 end) 
+0

Il recordId sarà un elenco dinamico (dimenticato di menzionarlo) – twsJames

+0

@twsJames - Dal momento che la tua affermazione è simile a 'in (22,15,105,1,65 , 32) 'stai già costruendo la tua query in modo dinamico, così potresti anche costruire l'ordine da allo stesso tempo. In caso contrario, come parametrizzare la query con un elenco dinamico di valori? –

+0

Questo ha funzionato per me, perfettamente! Grazie. –

-1

L'ultima volta che ho dovuto fare questo ho finito per fare un sindacato tutto e di generare una dichiarazione prescelta per ogni ID, cioè

select * from Table where RecordID = 22 
union all 
select * from table where recordid = 15 

ecc

E ' era un dolore ma ha funzionato.

+1

Non ci sono garanzie di ordinamento da 'UNION' o' UNION ALL' - il motore è libero di restituire i risultati in qualsiasi ordine sia più efficiente. Questo può, per caso, restituire i risultati nell'ordine richiesto, ma qualsiasi cosa (modifica della versione principale, service pack, hotfix, carico di lavoro sul server, ora del giorno, fase della luna, colore della maglietta) potrebbe significare che i risultati ritornano in un altro ordine –

+0

Per fare ciò dovresti aggiungere un valore sequenziale a ogni SELECT, ad es. SELECT [rank] = 1, * FROM Table WHERE ... UNION ALL SELECT [rank] = 2, * FROM Table WHERE ... ORDER BY [rank]. Ovviamente questo può diventare piuttosto costoso a seconda di cosa potrebbe essere necessario andare nella clausola WHERE, non importa se è necessario unirsi ad altri tavoli, quindi non posso tollerare questo approccio. È un dolore per diversi motivi. –

+0

Abbastanza corretto, sembra che sia appena diventato fortunato quando l'ho fatto. – DoctorMick

2

che avevo per l'ordinamento nel client, ma se si vuole veramente farlo in SQL, fare in questo modo:

declare @T table (id int identity(1,1), RecordID int) 

insert into @T (RecordID) 
values (22), (15), (105), (1), (65), (32) 

select * from 
[table] t 
inner join @t s on t.id=s.recordid 
where t.id in (22, 15, 105, 1, 65, 32) 
order by s.id 

(lavori in SQL Server 2008)

+0

Non riesco a trovare alcuna documentazione in entrambi i casi sull'eventualità che l'ordine delle righe all'interno del costruttore del valore di tabella di un'istruzione di inserimento sia rispettato w.r.t. Assegnazione dei valori di identità. Questo mi rende nervoso. –

+0

È rispettato. Altrimenti, puoi sempre farlo uno per uno. –