2009-10-23 12 views
7
create table jobs(
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, 
     ..... 
     salaryminus INTEGER UNSIGNED DEFAULT NULL, 
     salaryplus INTEGER UNSIGNED DEFAULT NULL, 
     ..... 
); 

voglio fare qualcosa di simile:Come ordinare per un massimo di due colonne che possono essere nulle in MySQL?

Select * from jobs order by maxof(salaryminus, salaryplus) limit 10; 

maxof(Null,1000) dovrebbe essere 1000,

Come implementare il maxof?

risposta

12

Se si sa che salaryplus sarà sempre maggiore di salaryminus, allora si può fare

order by coalesce(salaryplus, salaryminus, 0) 

coalesce restituirà il primo valore che non è nullo, o (in questo esempio) 0, se entrambi i valori sono nullo.

In caso contrario, fare qualcosa di simile:

order by greatest(ifnull(salaryminus,0), ifnull(salaryplus,0)) 

Questa tratterà sia salaryminus e salaryplus come 0 se sono nulli, e ordinerà il più grande dei due.

+1

Si noti che 'GREATEST' non è SQL standard. – Charles

+1

Non è nello standard, ma è fornito da MySQL, PostgreSQL e Oracle. È scritto "' MAX' "in SQLite. Se devi utilizzare SQL Server o devi scrivere SQL standard per una domanda sui compiti, usa "ORDINA PER CASO DOVE salaryminus> salaryplus THEN salaryminus ELSE salaryplus END" " –

0

È possibile utilizzare coalesce per trasformare invece le colonne potenzialmente nulle in valori specifici; ad esempio, coalesce(salaryminus, -99999999) restituirà un numero negativo elevato se salaryminus è nullo, ma restituirà salaryminus se non è null.

Problemi correlati