SQL - Modificador para ORDER BY

   
Vista:
Imágen de perfil de Noelia

Modificador para ORDER BY

Publicado por Noelia (3 intervenciones) el 14/03/2016 18:35:18
Hola,

quiero saber si existe alguna manera de modificar el ORDER BY para que no sólo ordene por orden alfabético, sino como tú le indiques. Un ejemplo para que se entienda mejor:

Imaginemos que tenemos una tabla con los campos ciudad y país, y queremos ordenar las ciudades por país. La consulta sería algo así:

1
SELECT * FROM CIUDADES ORDER BY PAIS

Esto me ordenaría los países por orden alfabético, es decir, me saldrían ordenados por ejemplo: Argentina, Bélgica, Canadá, Dinamarca, España...

Ahora me gustaría que apareciese España lo primero, y los demás ordenados como estaban, es decir, España, Argenitna, Bélgica, Canadá, Dinamarca...

Para ello, quería saber si existe alguna solución del tipo:

1
SELECT * FROM CIUDADES ORDER BY PAIS FIRST='España'

¿Existe algo así o hay alguna solución fácil para esto? Tened en cuenta que lo anterior es sólo un ejemplo, y puede ser más complejo lo que necesito. Por ejemplo, siguiendo con el ejemplo anterior, podría necesitar poner los primeros España, Colombia y Estados Unidos.

Espero que haya quedado bien explicado el problema. Un saludo y gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias

Modificador para ORDER BY

Publicado por Isaias (690 intervenciones) el 14/03/2016 19:14:29
Noelia

Se leeria mejor, "un ejemplo para poder explicarme mejor"

Veamos, ¿En que motor de base de datos estas trabajando?

Como lo veo, son DOS conjuntos, "España" y los demas, entonces ordena España y hasle una union con los demas, ¿cierto?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Noelia

Modificador para ORDER BY

Publicado por Noelia (3 intervenciones) el 14/03/2016 19:22:59
Estoy trabajando con PostgreSQL, pero eso es lo de menos ahora mismo. Sólo quiero saber si existe un modificador que haga eso. Efectivamente, ahora estoy utilizando una unión, pero como puede que sean varios conjuntos los que haya por delante (no sólo España, sino más países, según el ejemplo), quería ver si hay algo, digamos, más mantenible.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias

Modificador para ORDER BY

Publicado por Isaias (690 intervenciones) el 14/03/2016 20:50:46
Nuevamente Hola

No creo que exista algo asi, ya que es lo general que manejan los diferentes motores de bases de datos, lo tuyo, es por excepcion.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Modificador para ORDER BY

Publicado por leonardo_josue (878 intervenciones) el 14/03/2016 21:19:12
Hola Noelia:

En la mayoría de los motores de BD's puedes hacer ordenaciones selectivas utilizando CASE-WHEN, sin embargo no estoy seguro de si Postresql lo permite, la idea sería hacer algo como esto:

Supongamos que tenemos el ejemplo de la tabla países que comentas

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> SELECT *
    -> FROM paises
    -> ORDER BY descripcion;
+---------+-------------+
| id_pais | descripcion |
+---------+-------------+
|       1 | Argentina   |
|       2 | Bélgica     |
|       3 | Canadá      |
|       4 | Dinamarca   |
|       5 | España      |
+---------+-------------+
5 rows in set (0.00 sec)

Lo que puedes hacer es agregar una condición, para que en caso de ESPAÑA lo coloque primer lugar, y si es distinto de españo los coloque en segundo lugar. Esto lo haces así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT *
    -> FROM paises
    -> ORDER BY
    ->   CASE WHEN descripcion = 'España' THEN 1 ELSE 2 END,
    ->   descripcion;
+---------+-------------+
| id_pais | descripcion |
+---------+-------------+
|       5 | España      |
|       1 | Argentina   |
|       2 | Bélgica     |
|       3 | Canadá      |
|       4 | Dinamarca   |
+---------+-------------+
5 rows in set (0.00 sec)

En otras palabras, lo que haces en el CASE WHEN es "crear" una columna virtual que hace las veces de un campo de prioridad:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SELECT
    ->   descripcion,
    ->   CASE WHEN descripcion = 'España' THEN 1 ELSE 2 END prioridad
    -> FROM paises ;
+-------------+-----------+
| descripcion | prioridad |
+-------------+-----------+
| Argentina   |         2 |
| Bélgica     |         2 |
| Canadá      |         2 |
| Dinamarca   |         2 |
| España      |         1 |
+-------------+-----------+
5 rows in set (0.00 sec)


De tal suerte que primero se ordenan los registros con PRIORIDAD 1 y después el resto los de PRIORIDAD 2... como segundo criterio de ordenación utilizas la descripción, para que lo haga de manera alfabética.

Checa el ejemplo en PosgreSQL y nos comentas si te funciona.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Noelia

Modificador para ORDER BY

Publicado por Noelia (3 intervenciones) el 14/03/2016 21:52:23
Muchísimas gracias, Leonardo. Exactamente eso es lo que necesito. Mañana en cuanto pueda lo pruebo y te comento. Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar