2010-07-21 14 views
32

tengo una tabla con las categorías:SQLite y personalizada ordenado por

ID Category 
"1","Baking" 
"3","Family" 
"4","Entertaining" 
"5","Children" 
"6","Desserts" 

Ahora me gustaría pedir el resultado de la instrucción de selección a

ID Category 
"4","Entertaining" 
"3","Family" 
"1","Baking" 
"5","Children" 
"6","Desserts" 

por ejemplo. En MySQL, lo harías así:

SELECT * FROM CATEGORIES ORDER BY FIELD (ID, 4,3,1,5,6); 

¿Cómo lo harías en SQLite? No tengo un campo "ordenar por".

Respuesta

59
ORDER BY 
    CASE ID 
    WHEN 4 THEN 0 
    WHEN 3 THEN 1 
    WHEN 1 THEN 2 
    WHEN 5 THEN 3 
    WHEN 6 THEN 4 
    END 
+3

+1 ya mí también, yo estaba escribiendo a cabo. La otra opción, por supuesto, es crear un atributo que actúe como prioridad, luego puedes simplemente ordenar por la prioridad. Esta no es la forma ideal, pero una solución que tuve que usar en el pasado. – northpole

+0

Para velocidad con grandes conjuntos de datos, probablemente crearía una tabla de ayuda indexada que contiene los ID y su orden deseada, y luego se unirá a ella y ordenará por su columna indexada. No estoy seguro de cómo SQLite manejaría esto, pero los motores de DB "más grandes" probablemente se beneficiarían, ya que la expresión CASE no es óptima para ordenar. – Tomalak

1

no tengo una "orden de" campo

Por qué no?

Si es porque el orden de clasificación es específico de la aplicación, haga la clasificación en la aplicación en lugar de en la base de datos.

Si es porque el orden de clasificación es específico para solo esta consulta, codifíquela en la consulta. SIN EMBARGO, le sugiero encarecidamente que la haga transparente a la aplicación que realiza la llamada, p. (Sintaxis SQL estándar):

SELECT T2.ID, T2.Category, 
     T2.query_name_here_sort_order 
    FROM (
     SELECT T1.ID, T1.Category, 
       CASE ID 
        WHEN 4 THEN 1 
        WHEN 3 THEN 2 
        WHEN 1 THEN 3 
        WHEN 5 THEN 4 
        WHEN 6 THEN 5 
       END AS query_name_here_sort_order 
      FROM CATEGORIES AS T1 
     ) AS T2 (
       ID, Category, 
       query_name_here_sort_order 
       ) 
ORDER 
    BY query_name_here_sort_order; 

Si el orden de clasificación es utilizada por varias consultas y/o aplicaciones a continuación, agregarlo a una columna en una tabla en la base de datos a continuación, utilizar esa columna en la consulta.

0

Una segunda manera de hacerlo (el primero de ellos con CASE WHEN ... THEN END como ya se ha dicho en otras respuestas) es:

ORDER BY ID=4 DESC, 
     ID=3 DESC, 
     ID=1 DESC, 
     ID=5 DESC, 
     ID=6 DESC