2012-02-27 19 views
5

Ho bisogno di scrivere una semplice query in mySQL che avrebbe utilizzato MIN() in WHERE clausola, calcolando un valore minimo di due numeri, in cui uno di loro è valore della colonna (con possibile valore NULL) e altro è un numero fisso, qualcosa di simile>MIN() nella clausola WHERE

SELECT ... WHERE ... (len <= MIN(maxStay, 365))

so che posso scrivere qualcosa di simile>

SELECT ... WHERE ... ((len <= maxStay) OR (maxStay IS NULL)) AND (len <= 365)

ma preferirei qualcosa di semplice, come usare MIN() nella clausola WHERE. È possibile? E se sì, quali sono le prestazioni migliori?

+0

Cosa vuoi il comportamento di essere se il valore della colonna è NULL? –

+0

@Ike ~ NULL significa nessun limite –

+0

Grazie, controlla la mia risposta aggiornata. Dovrebbe fare quello che vuoi. –

risposta

5

Per restituire il minore tra i due valori, utilizzare la funzione LEAST in MySql. Per gestire i valori nulli, utilizzare IFNULL().

WHERE len <= LEAST(IFNULL(maxStay, 365), 365) 
+0

Giusto. Ho cancellato i commenti riferiti alla tua risposta prima della modifica. – Kamil

+0

@Michael ~ Il valore NULL non dovrebbe significare alcun limite, quindi credo che la formula corretta dovrebbe essere 'WHERE len <= LEAST (IFNULL (maxStay, 365), 365)', corretto? Che dire delle prestazioni? –

+0

@stackoverflow Le prestazioni dipenderanno dai tuoi indici. Se len è indicizzato, questa query dovrebbe fare uso di tale indice. Tuttavia, maxStay non sarà sargable con questa query ... –

-1

La funzione che si sta cercando è LEAST():

mysql> select least(1,2); 
+------------+ 
| least(1,2) | 
+------------+ 
|   1 | 
+------------+ 

Quindi la query sarebbe qualcosa di simile (aggiornato per gestire NULL come richiesto):

SELECT ... 
WHERE ... ((maxStay IS NULL) OR (maxStay IS NOT NULL AND len <= LEAST(maxStay, 365))) 
+0

LEAST non risolverà i valori NULL – GolezTrol

+0

Grazie, non ho notato l'OP menzionato NULL. Ho aggiunto un commento alla domanda per chiedere chiarimenti su cosa fare nel caso di valori di colonna NULL. –

0

Si desidera che il LEAST funzione; MIN è una funzione di aggregazione su colonna Valori

2

min e max sono funzioni di aggregazione e non possono essere utilizzati nella clausola where, anche se possono essere utilizzati nella clausola having.

Ma penso che stiate cercando LEAST, anche se non funziona con valori NULL. Se scrivi LEAST(1, NULL), restituirà sempre NULL, a prescindere dal valore inserito anziché da 1.

Si potrebbe utilizzare IFNULL per aggirare che:

SELECT 
    ... 
WHERE 
    len <= LEAST(IFNULL(maxStay, 365), 365) 
+0

Non funzionerà. MENO() ha bisogno di 2 argomenti. Volevi scrivere questo invece? 'MENO (IFNULL (maxStay, 365), 365)' –

+0

Credo che Ike abbia ragione –

+0

Oops. Ho dimenticato un po '. Aggiustato. Grazie, Ike. – GolezTrol