2013-04-17 26 views
17

Dal momento che non è possibile utilizzare una colonna calcolata in una clausola where in MySQL come questo:Calcolato colonna nella clausola where - prestazioni

SELECT a,b,c,(a*b+c) AS d FROM table 
WHERE d > n 
ORDER by d 

è necessario utilizzare

SELECT a,b,c,(a*b+c) AS d FROM table 
WHERE (a*b+c) > n 
ORDER by d 

È il calcolo (nell'esempio "(a * b + c)" eseguito una volta per riga o due volte? Esiste un modo per renderlo più veloce? Trovo strano che sia possibile ORDINARE sulla colonna ma non avere una clausola WHERE.

risposta

34

È possibile utilizzare HAVING per filtrare su una colonna calcolata:

SELECT a,b,c,(a*b+c) AS d, n FROM table 
HAVING d > n 
ORDER by d 

Si noti che è necessario includere n nella clausola SELECT per questo al lavoro.

+0

è fantastico! È meglio/uguale/peggiore delle prestazioni rispetto alla ripetizione della formula in una clausola WHERE? La leggibilità è ovviamente migliore :) –

+0

È possibile che mysql optimizer sia in grado di rilevare che le formule WHERE e SELECT sono le stesse e non calcolarlo due volte. Ma dato il track record di mysql, ne dubito. Benchmark e vedere. – Barmar

+2

FYI: Sembra che questa soluzione funzioni solo per MySQL e SQL Server. –

2

Si potrebbe fare questo:

SELECT a,b,c,d FROM 
(SELECT a,b,c,(a*b+c) AS d) AS tmp 
WHERE d > n 
ORDER BY d 

ma non sono sicuro di quello che le implicazioni delle prestazioni potrebbe avere.

+1

Funzionerà anche questo? Non c'è una colonna 'n' nella sottoquery. – Barmar

+1

'n' deriva dalla query nella domanda iniziale, immagino che il poster significhi per' n' un certo valore. In caso contrario, la sottoquery dovrebbe essere sostituita con '(SELEZIONA a, b, c, (a * b + c) AS d, n) AS tmp' – Walid

Problemi correlati