2011-07-07 24 views
17

he la siguiente consulta que devuelve filas en función de una lista separada por comasSQL - ordenado por orden de la lista

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

separados Me gustaría que los resultados de esta consulta para volver a en el orden de los ID en la lista . ¿Es eso posible con SQL?

Gracias de antemano

+0

Qué base de datos SQL sistema, o necesitas algo portátil? –

Respuesta

10

Si necesita la salida a aparecer en un orden particular, entonces se necesita especificar ese orden, usando algo que el servidor puede ordenar. Sin saber con qué motor está trabajando, el esquema general sería crear una tabla temporal o usar constructores de conjuntos de filas para emparejar cada ID de registro con su orden de clasificación deseado.

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

Muchas gracias, Works a treat. – twsJames

0

Sí. Agregue la cláusula ORDER BY recordedid al final.

+2

No creo que lo entienda: quiere la * misma * orden que en la consulta – Bohemian

+0

tiene razón, esto no estaba claro para mí. – nabuchodonossor

-3

Uso ORDER BY contra la RecordID

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

Hola Talha, me gustaría que los registros se ordenen en el mismo orden que la lista. p.ej. Registro 1 = id 22, registro 2 = id 15, etc. ¿Es posible – 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

? El registro Id será una lista dinámica (se olvidó de mencionar que) – twsJames

+0

@twsJames - Dado que su afirmación se ve así 'en (22,15,105,1,65 , 32) 'usted ya está construyendo su consulta dinámicamente así que también podría construir el 'orden por' al mismo tiempo. Si no, ¿cómo parametrizar su consulta con una lista dinámica de valores? –

+0

Esto funcionó para mí, perfectamente! Gracias. –

-1

La última vez que tuve que hacer esto terminé haciendo una unión de todo y generar una instrucción de selección para cada ID, es decir

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

etc.

Se fue un dolor pero funcionó.

+1

No hay garantías de pedido de 'UNION' o 'UNION ALL': el motor puede devolver los resultados en el orden que considere más eficiente. Esto puede, por casualidad, devolver los resultados en el pedido solicitado, pero cualquier cosa (cambio de versión principal, paquete de servicio, revisión, carga de trabajo en el servidor, hora del día, fase de la luna, color de la camisa) podría significar que los resultados regresen en otra orden –

+0

Para hacer esto, debe agregar un valor secuencial a cada SELECCIÓN, p. SELECCIONE [rank] = 1, * FROM Tabla DONDE ... UNION ALL SELECCIONE [rank] = 2, * FROM Tabla DONDE ... PEDIDO POR [rank]. Por supuesto, esto puede ser bastante costoso dependiendo de qué más tenga que ir en la cláusula WHERE, sin importar si se requieren uniones a otras tablas, así que ciertamente no apruebo este enfoque. Es un dolor por varias razones. –

+0

Es suficiente, parece que tuve suerte cuando lo hice. – DoctorMick

2

que había al orden en el cliente, pero si realmente quiere hacerlo en SQL, lo hacen así:

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 

(funciona en SQL Server 2008)

+0

No puedo encontrar ninguna documentación de ninguna manera sobre si se respetará el orden de las filas dentro del constructor del valor de tabla de una instrucción de inserción w.r.t. Asignaciones de valores de IDENTIDAD. Eso me pone nervioso. –

+0

Se respeta. De lo contrario, siempre puedes hacerlo uno por uno. –