2012-03-12 26 views
9

Tengo una tabla con tres columnas; la primera columna contiene ID y las otras dos columnas contienen fechas (donde como máximo uno es nulo, pero no creo que esto afecte a nada). ¿Cómo haría para ordenar los ID en función de qué fecha es más grande? He intentadoorden SQL por dos columnas diferentes (posiblemente nulas)

ORDER BY CASE 
WHEN date1 > date2 THEN date1 
ELSE date2 
END 

pero esto no funcionó. ¿Alguien puede ayudarme? Además, todos los problemas similares que he visto que otros publican lo tienen para que la consulta ordene los resultados según la primera columna, y luego, si la primera columna es nula, la segunda columna. ¿Primero tendría que definir cada valor nulo? Estoy creando esta tabla mediante una combinación externa completa, por lo que sería una pregunta completamente diferente, así que con suerte se puede hacer con valores nulos.

+1

Su expresión 'CASE' se ve bien para mí, excepto en que no admite el caso en que' date2' es nulo; para admitir eso también, le gustaría escribir (decir) 'PEDIR POR CASO CUANDO fecha1> fecha2 O fecha2 ES NULA ENTONCES fecha1 FECHA EL2 END '. Pero dices que "no funcionó". ¿Puedes ser mas específico? Por ejemplo, ¿puede publicar datos reales que no se ordenan correctamente? – ruakh

+0

Gabe, ¿qué base de datos ejecutará la consulta? –

+0

Lo siento, pensé que todos funcionaban igual. Pero estoy usando Oracle. No sé si eso es lo suficientemente específico para ustedes, sin embargo. : S –

Respuesta

15

Creo que su problema está relacionado con la comparación no sea cuando la columna es NULL. Por lo tanto, es probable que necesite:

ORDER BY CASE 
      WHEN date1 IS NULL THEN date2 
      WHEN date2 IS NULL THEN date1 
      WHEN date1 > date2 THEN date1 
      ELSE     date2 
      END 
+0

¡Esto lo hizo, gracias! :RE –

-1

Try ...

SELECT MAX(date1,date2) date FROM table ORDER BY date; 
+0

Sí, pero realmente no puede hacerlo en Standard SQL sin unir de algún modo la tabla en sí mismo en date1! = Null, luego unirse de nuevo en date2! = Null, pero ambos dan el mismo ALIAS que tiene un comportamiento indefinido. – DanRedux

+0

(He eliminado mis comentarios anteriores, para reemplazarlos por uno que sea más claro.) No creo que ningún DBMS soporte el uso de 'MAX'; tal vez estás pensando en "LO MÁS GRANDE" Pero de todos modos, realmente no hay necesidad de este enfoque; estas expresiones pueden ir en la cláusula 'ORDER BY' muy bien. – ruakh

+0

Podrían, pero aliasing como su propia columna permite que la fecha también se recupere. Funcionalidad extra y gratuita. – DanRedux

Cuestiones relacionadas