2011-10-22 27 views
7

Aquí está la situación que estoy tratando de resolver:Ordenamiento personalizado en orden SQL por cláusula?

Tengo una consulta que podría devolver un conjunto de registros. El campo por el que se ordenó podría tener varios valores diferentes. En aras de esta pregunta, diremos que el valor podría ser A, B, C, D, E o Z

Ahora, dependiendo de los resultados de la consulta , la clasificación debe comportarse de la siguiente manera: Si solo se encuentran registros AE, entonces ordenarlos "naturalmente" está bien. Pero si hay un registro Z en los resultados, debe ser el primer resultado en la consulta, pero el resto de los registros debe estar en orden de clasificación "natural".

Por ejemplo, si ACD se encuentran, entonces el resultado debe ser

A 
C 
D 

Pero si ABDEZ se encuentran a continuación, el resultado debe ser ordenados:

Z 
A 
B 
D 
E 

Actualmente, la consulta se parece a:

SELECT NAME, SOME_OTHER_FIELDS FROM TABLE ORDER BY NAME 

Sé que puedo codificar una función de ordenación para hacer lo que quiero, pero debido a la forma en que estoy usando los resultados, parece que no puedo usar porque los resultados están siendo manejados por una biblioteca de terceros, a la que acabo de pasar la consulta SQL. Luego está procesando los resultados, y parece que no tengo ganchos para ordenar los resultados y simplemente pasar los resultados a la biblioteca. Necesita hacer la consulta SQL en sí, y no tengo acceso al código fuente de la biblioteca.

Así que para todos ustedes gurús SQL por ahí, ¿pueden hacerme una consulta que haga lo que quiero?

+2

cual de las bases de datos esta usando? – evilone

+0

DB2 es el back-end. Estoy trabajando con algún código heredado. Si puedo evitar cambiar el SQL que está usando el sistema, lo hago. Pero ocasionalmente encuentro cosas que necesitan arreglo. –

Respuesta

33

¿Cómo identifica el registro Z? ¿Qué lo diferencia? Una vez que comprenda eso, agréguelo a su clausula ORDER BY.

SELECT name, * 
FROM [table] 
WHERE (x) 
ORDER BY 
    (
    CASE 
     WHEN (record matches Z) THEN 0 
     ELSE 1 
    END 
    ), 
    name 

De esta manera, sólo el registro Z coincidirá con el primer pedido, y todos los demás registros se ordenan por la segunda orden de clasificación (nombre). Puede excluir el orden de segundo orden si realmente no lo necesita.

Por ejemplo, si Z es la cadena de caracteres 'Bob', entonces la consulta podría ser:

SELECT name, * 
FROM [table] 
WHERE (x) 
ORDER BY 
    (
    CASE 
     WHEN name='Bob' THEN 0 
     ELSE 1 
    END 
    ), name 

Mis ejemplos son para T-SQL, ya que usted no ha mencionado qué base de datos que está utilizando .

+0

Parece que podría ir en la dirección que quiero ir. –

1

No estoy seguro que DB se utiliza - las siguientes obras para Oracle:

SELECT 
NAME, 
SOME_OTHER_FIELDS, 
DECODE (NAME, 'Z', '_', NAME) SORTFIELD 
FROM TABLE 
ORDER BY DECODE (NAME, 'Z', '_', NAME) ASC 
1

Hay un número de maneras de resolver este problema y la mejor solución depende de una serie de factores que no se discuten como la naturaleza de esos valores A..Z y qué producto de base de datos está utilizando.

Si sólo tiene un único valor que tiene para clasificar en la parte superior, puede ORDER BY una expresión que se asigna ese valor al valor de ordenación más bajo posible (con CASE o IIF o IFEQ, dependiendo de su base de datos).

Si tiene varios valores especial clasificar diferentes que podrían ORDER BY una expresión más complicado o que pudiera UNION juntos varios SELECT s, con una SELECT para el tipo por defecto y un extra SELECT para cada valor especial. El SELECT s incluiría una columna de clasificación.

Finalmente, si tiene bastantes valores, puede colocar los valores de clasificación en una tabla separada y JOIN en su consulta.

Cuestiones relacionadas