2012-04-20 33 views
6

estamos consultando la base de datos para recuperar los datos en el seguimiento de la modapersonalizada en SQL

seleccionar a, b, f ... a partir de tabla1 donde id en (6,33,1,78,2)

El resultado que obtuve de la consulta está en el orden siguiente 1,2,6,33,78.

Quiero el resultado en mismo orden (6,33,1,78,2). ¿Hay alguna forma de recuperar los datos en el mismo orden?

EDITAR * Estoy utilizando SQL 2008 *

+0

Qué motor de base de datos están utilizando yuo? –

+1

Se ha eliminado la etiqueta C# (irrelevante). @Ram: Supongo que no quieres solución en C# para esto. –

Respuesta

9

agregar esta cláusula order by

order by case 
     when id = 6 then 1 
     when id = 33 then 2 
     when id = 1 then 3 
     when id = 78 then 4 
     when id = 2 then 5 
     end 

Si se utiliza MySQL puede hacer esto

ORDER BY FIND_IN_SET(id, '6,33,1,78,2') 
+0

debería ser 'cuando id = 6 luego 1' ... –

+0

Gracias por eso. Corregido. –

1

solución fea:

select a,b,...f from table1 where id in 6 
UNION 
select a,b,...f from table1 where id in 33 
and so on.. 

solución "mejor": añadir otra columna en su consulta y hacer caso 6 a continuación, 0, caso 33 luego 1 y así sucesivamente

select a,b,...f , case id when 6 then 0 when 33 then 1 <and so on> end 
from table1 where ... 

y luego ordenado por esta nueva columna

2

I No conozco el fondo, pero generalmente logro este orden personalizado en una columna adicional de orderIndex. De esta forma puedo administrar manualmente el pedido al insertar en la tabla y agregar esta columna a la cláusula ORDER BY de las consultas predeterminadas

+0

Nota: esto se puede indexar para que el rendimiento no sea un problema, como en el caso de una solución de CASE-ing difícil de administrar. – Robesz

2

Si usa SQL Server puede usar charindex.

select A, B 
from Table1 
where ID in (6,33,1,78,2) 
order by charindex(','+cast(ID as varchar(10))+',', ',6,33,1,78,2,') 
3

El uso de un Table Value Constructor:

SELECT a, b, ... f 
FROM 
     table1 
    JOIN 
     (VALUES 
      (1, 6), 
      (2, 33), 
      (3, 1), 
      (4, 78), 
      (5, 2) 
     ) AS ordering (position, id) 
     ON ordering.id = table1.id 
ORDER BY position