Foros del Web » Programando para Internet » ASP Clásico »

Ordenar un campo cuando hay valores null

Estas en el tema de Ordenar un campo cuando hay valores null en el foro de ASP Clásico en Foros del Web. Hola a todos, tengo una consulta a una bd, en la cual básicamente tengo una tabla de productos y servicios (gc_items) relacionados a una tabla ...
  #1 (permalink)  
Antiguo 29/11/2005, 10:46
Avatar de Hereje  
Fecha de Ingreso: junio-2002
Ubicación: Córdoba, Argentina
Mensajes: 439
Antigüedad: 22 años
Puntos: 2
Ordenar un campo cuando hay valores null

Hola a todos, tengo una consulta a una bd, en la cual básicamente tengo una tabla de productos y servicios (gc_items) relacionados a una tabla de precios (gc_items_precios) ya que cada ítem puede tener varios precios. El problema surge cuando quiero ordenar por precio de forma ascendente, si el ítem no tiene precio (no hay relación) devuelve "null" y siempre los pone primero, y yo quisiera que los ordene en forma ascendente con los null al final, ¿hay alguna forma de hacer posible esto?

Yo utilizo la siguiente consulta (es una bd MySQL):
Código:
<%
sql = "select a.id_item, a.id_comercio, a.tipo, a.marca, a.nombre, a.descripcion, b.pagos, b.precio, d.simbolo, c.nombre, c.ext, e.nombre, e.carpeta from ((((gc_items a left join gc_items_precios b on a.id_item = b.id_item and b.defecto = 1) left join gral_galerias_fotos c on c.id_galeria = a.id_galeria and c.orden = 1) left join gral_monedas d on d.id_moneda = d.id_moneda) inner join gc_comercios e on e.id_comercio = a.id_comercio) inner join gc_items_tapa f on f.id_item = a.id_item and f.orden < 4 where e.habilitado = 1 and a.id_rubro = " & id_rubro & " group by a.id_item order by length(c.nombre) desc, b.precio asc, a.nombre asc"
%>
Esta medio complejo el tema de la consulta (¿alguien sabe si se puede optimizar un poco o así esta bien?) pero funciona a la perfección, tengo ese único problema nomás.

Espero alguien me pueda ayudar, busqué algo por la red pero sigo cayendo en los null primero ("order by null desc" me tira cualquier cosa y no pude especificar el campo, y como hay varios null...) y estoy medio ajustado con los tiempos.

Un abrazo a todos y hasta luego!

Edit:
Ya sé que este post deberia ir en Bases de Datos, pero como por acá tengo más confianza empiezo por aquí, de todas formas si lo mueven, bue...
__________________
Sergio
  #2 (permalink)  
Antiguo 29/11/2005, 11:37
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 3 meses
Puntos: 535
En MySQL no tengo idea... pero supongo tendrá alguna función condicional parecida al IIf(expresion, parte verdadera, parte falsa) de access.

Entonces podrías decirle que ordene...

ORDER BY IIf(IsNumeric(Tabla.CampoPrecio),Tabla.CampoPrecio ,1000000)

La cuestión sería que reemplace los nulos (o los no numéricos) por un valor muy alto e imposible (puse un millón, pero vos sabrás cuál valor se ajusta a los alto e imposible de tus productos). Por supuesto, en el SELECT incuirás el campo CampoPrecio sin hacerle ningún condicional para obtener los valores reales.

Tal vez exista otra forma, pero esa funciona ;)


Por cierto, Sergio, te llegó la respuesta al MP de la otra vez?
__________________
...___...
  #3 (permalink)  
Antiguo 29/11/2005, 12:05
Avatar de Hereje  
Fecha de Ingreso: junio-2002
Ubicación: Córdoba, Argentina
Mensajes: 439
Antigüedad: 22 años
Puntos: 2
Al, no sólo existe la función IF(exp1,exp2,exp3) dónde exp1 es la condición y devuelve exp2 si es verdadera o exp3 si es falsa sino que también existe una funcioncita hermosa, se llama IFNULL(exp1,exp2) que devuelve exp2 si exp1 es null o el valor sino es null.

Como todos los precios son numéricos le puse una letra 'a' si es el precio es null, asi que me los ordena perfectamente.

Ya había pensado la forma que me dijiste, pero creí que era más complejo el tema, me faltaba tu empujoncito digamos.

Muchas gracias por la ayuda!

Con respecto al MP si me llegó, y ya me estoy preparando para ese gran momento, así que espero novedades.

Un abrazo y gracias nuevamente, y siempre estaré sorprendido por tus conocimientos y sobre todo la paciencia, buen humor y coordialidad.
__________________
Sergio
  #4 (permalink)  
Antiguo 29/11/2005, 12:10
Avatar de macedo  
Fecha de Ingreso: enero-2002
Ubicación: Madrid
Mensajes: 124
Antigüedad: 22 años, 4 meses
Puntos: 0
Haz un UNION de dos consultas, la primera con la condicion precio is not null y la segunda con la condicion precio is null

Saludos
__________________
"Hay que simplificar las cosas tanto como sea posible, pero no más".
Albert Einstein.
  #5 (permalink)  
Antiguo 29/11/2005, 12:20
Avatar de Hereje  
Fecha de Ingreso: junio-2002
Ubicación: Córdoba, Argentina
Mensajes: 439
Antigüedad: 22 años
Puntos: 2
Ya está solucionado macedo con el IFNULL, gracias por responder, pero creo que no es el resultado que yo necesito la alternativa que propones.

Hasta luego!
__________________
Sergio
  #6 (permalink)  
Antiguo 29/11/2005, 13:05
Avatar de macedo  
Fecha de Ingreso: enero-2002
Ubicación: Madrid
Mensajes: 124
Antigüedad: 22 años, 4 meses
Puntos: 0
si pones
Select * from ((select a.id_item, a.id_comercio, a.tipo, a.marca, a.nombre, a.descripcion, b.pagos, b.precio, d.simbolo, c.nombre, c.ext, e.nombre, e.carpeta from ((((gc_items a left join gc_items_precios b on a.id_item = b.id_item and b.defecto = 1) left join gral_galerias_fotos c on c.id_galeria = a.id_galeria and c.orden = 1) left join gral_monedas d on d.id_moneda = d.id_moneda) inner join gc_comercios e on e.id_comercio = a.id_comercio) inner join gc_items_tapa f on f.id_item = a.id_item and f.orden < 4 where e.habilitado = 1 and a.id_rubro = " & id_rubro & " and b.precio is not null group by a.id_item order by length(c.nombre) desc, b.precio asc, a.nombre asc)
UNION
(select a.id_item, a.id_comercio, a.tipo, a.marca, a.nombre, a.descripcion, b.pagos, b.precio, d.simbolo, c.nombre, c.ext, e.nombre, e.carpeta from ((((gc_items a left join gc_items_precios b on a.id_item = b.id_item and b.defecto = 1) left join gral_galerias_fotos c on c.id_galeria = a.id_galeria and c.orden = 1) left join gral_monedas d on d.id_moneda = d.id_moneda) inner join gc_comercios e on e.id_comercio = a.id_comercio) inner join gc_items_tapa f on f.id_item = a.id_item and f.orden < 4 where e.habilitado = 1 and a.id_rubro = " & id_rubro & " and b.precio is null group by a.id_item order by length(c.nombre) desc, b.precio asc, a.nombre asc))

Lo que te va a hacer es sacar primero los que tengan b.precio<>null ordenados como tu los quieres y a continuacion los que tienen b.precio=0

Lo que hace union es concatenar el resultado de dos select uno a continuancion del otro.

Pruebalo. Creo que debería funcionar.

Saludos
__________________
"Hay que simplificar las cosas tanto como sea posible, pero no más".
Albert Einstein.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:45.