2009-08-23 13 views
8

Tengo una tabla definida por:ORDER BY en diferentes columnas en diferentes direcciones en SQLite

CREATE TABLE bar_table (
     _id INTEGER NOT NULL PRIMARY KEY, 
     index INTEGER NOT NULL DEFAULT '65535', 
     _date DATE 
    ) 

Mi instrucción de selección básico es:

SELECT * FROM bar_table ORDER BY <your-clause-here> 

¿Cómo ordeno mi selección por el índice ascendente, y fecha descendiendo? es decir, los índices pequeños vienen antes de los índices grandes. En el caso de que dos índices sean iguales, la fecha posterior será la primera.

La documentación me está señalando hacia COLLATion, pero realmente no estoy seguro de qué es eso.

Respuesta

21

Si bien sé que ya tiene su propia respuesta aquí, creo que es pertinente entrar en detalles aquí.

En primer lugar, la cláusula order by va por orden de columnas o expresiones especificadas. En este caso:

order by index asc, _date desc 

Ese tipo de index más pequeño al más grande (asc final), y luego _date más grande al más pequeño (desc final). Mientras que asc es el valor predeterminado, generalmente lo incluyo cuando tengo varias columnas que van en direcciones opuestas, como lo hace aquí.

También puede incluir expresiones en su order by:

order by case when index < 0 then 1 else 0 end desc, _date desc 

Esto pondría a todos los negativos index filas en la parte superior, y luego ordenar los de _date. Usar expresiones en su cláusula order by es muy efectivo en ciertas circunstancias.

Ahora, usted mencionó collation, y una pequeña confusión en cuanto a qué es eso. La intercalación es la forma en que la base de datos trata el capital y los acentos en las comparaciones de cadenas. Con una intercalación Captial-Sensitive, 'abc' != 'ABC'. Sin embargo, con una intercalación Insensible a la captura, 'abc' = 'ABC'.

Debe tenerse en cuenta que la intercalación es no un juego de caracteres. Eso generalmente está determinado por el tipo de datos (varchar == ASCII, nvarchar == Unicode). La intercalación determina cómo se comparan las cadenas, no qué conjuntos de caracteres están disponibles para su uso.

Además, la intercalación también es importante con ciertos idiomas. Dada una intercalación latina, solo tiene que preocuparse por las mayúsculas y los acentos, pero dada una intercalación danesa, 'aa' = 'å'. Por lo tanto, puede ver que la intercalación también juega un papel importante en la determinación de la ordenación y las comparaciones para diferentes idiomas.

La intercalación es muy importante al hacer el pedido, ya que determina cómo se ordenarán las cadenas dadas las diferentes mayúsculas y acentos. Es por eso que sigue apareciendo en tus búsquedas. La intercalación es importante, ¡e incluso affected StackOverflow esta semana!

: Gracias a Michael Madsen por señalar este ejemplo específico.

+0

La recopilación no es solo una cuestión de comparar letras mayúsculas y acentos, sino que es ordenar los caracteres en general, incluyendo el tratamiento de secuencias de caracteres regulares como equivalentes a otros caracteres. Por ejemplo, en danés, "aa" sigue siendo una forma válida de escribir "å", aunque å es la última letra del alfabeto danés, por lo que usar una intercalación danesa ordenaría el texto en consecuencia (generalmente es correcto dado el idioma esperado, y la computadora no puede decidir por sí misma si se trata de un caso como la ciudad alemana de Aachen, donde aa obviamente no se usa como å). –

+1

Gracias. Estoy bastante seguro de haber probado tu sugerencia de 'ordenar por índice asc, _ fecha desc', pero sin éxito. – jamesh

+0

@jamesh: ¿De verdad? ¿Estás seguro? Porque eso funcionaría en casi todos los RDBMS disponibles. La única vez que pude pensar en dónde esto no funcionaría es si '_date' era un campo' varchar' en lugar de 'datetime'. Tal vez necesites encapsular 'index' con backticks, como' \ 'index \' '. – Eric

Cuestiones relacionadas