2015-04-30 4 views
9

quindi voglio trasformare valore negativo di in un 0. Ho trovato 2 soluzioni che fanno esattamente la stessa:SQL 0 se il valore negativo

SUM(IF(ordered_item.amount < 0, 0, ordered_item.amount)) as purchases 

E

SUM(CASE WHEN ordered_item.amount < 0 THEN 0 ELSE ordered_item.amount END) as purchases 

mi danno entrambi la stessa risultato, ma quale mi darebbe la migliore prestazione ? E c'è forse una soluzione più semplice per trasformare i negativi in ​​0.

+1

Perché non solo "MAX (ordered_item.amount, 0)'? – MikeTheLiar

+2

È possibile utilizzare 'EXPLAIN {{QUERY}}' per verificare quale query è più complessa – Germanaz0

+1

Nella maggior parte degli RDBMS è probabile che il pianificatore di query generi lo stesso piano di esecuzione per qualcosa di simile. Usa 'EXPLAIN' su ogni query come suggerisce @ Germanaz0. –

risposta

20

Un approccio alternativo è possibile utilizzare la funzione GREATEST().

SUM(GREATEST(ordered_item.amount, 0)) as purchases 
+0

Questa sembra la soluzione più semplice! Grazie – Bram

+2

Mi piace di più questa soluzione. Ogni volta che è possibile eseguire lo stesso compito in un numero inferiore di righe SQL è una buona cosa, IMO. Ancora meglio è che ha le stesse prestazioni dei suggerimenti dell'OP: http://sqlfiddle.com/#!9/90f21/3 – AdamMc331

+0

@ McAdam331 Hai ragione! – Bram

3

È possibile definire il campo come "non firmato" in modo da nessuna conversione sarebbe necessario

CREATE TABLE ordered_item ( 
order_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
amount INT UNSIGNED NOT NULL, 
PRIMARY KEY (`order_id `) 
); 

https://dev.mysql.com/doc/refman/5.0/en/integer-types.html

+0

Non sono autorizzato a modificare il tavolo, ma ottima risposta! Lo terrò a mente per il futuro. Grazie – Bram