2013-01-22 12 views
9

MySQL's BETWEEN include tutti i risultati tra due endpoint e gli endpoint.MySQL TRA senza endpoint

Se espressione è maggiore o uguale a MIN e espr è inferiore o uguale al massimo, tra i rendimenti 1, altrimenti restituisce 0. Ciò equivale all'espressione (min < = espr AND espr < = max) se tutti gli argomenti sono dello stesso tipo. Reference http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_between

Esiste una funzione come REALLYBETWEEN che non include gli endpoint, o sto bloccato usando min < expr AND expr < max?

+2

Sei bloccato ... E non è una cosa così brutta. è almeno esplicito. –

+2

'TRA min + 1 E max - 1', se stai lavorando con tipo integrale. – mellamokb

+0

@MichaelBerkowski. Grazie. Sono stato alla ricerca e non ho trovato nulla, ma non ero sicuro. Le buone notizie erano prima di oggi, ho pensato che BETWEEN non includeva gli endpoint. Almeno ora lo so. – user1032531

risposta

11

penso che si può solo scrivere voi stessi come:

where val > start and val < end 

mezzo c'è:

where val >= start and val <= end 

Per quanto riguarda gli indici, i primi due dovrebbero utilizzare un indice correttamente e in modo identico a between, partendo dal presupposto che inizio e fine sono costanti. Non sono sicuro se l'ultima versione lo farà.

Se val è un'espressione complessa, quindi prendere in considerazione la seguente:

select * 
from (your query here) t 
where t.val > start and t.val < end 

Questo dovrebbe valutare val solo una volta. Penso che le altre forme lo valuterebbero due volte.

Oppure, si potrebbe fare:

where val between start and end and val not in (start, end) 
+0

L'ultimo suggerimento è un modo creativo per utilizzare BETWEEEN senza endpoint! Non pensare che qualcuno dovrebbe usarlo, ma ha sicuramente risposto alla domanda. Continuerò a utilizzare le prime due soluzioni. – user1032531

1

noti che BETWEEN è un'espressione, non una funzione. È solo una comodità di codifica e significa esattamente ciò che viene detto. Non ci sono benefici per le prestazioni.

Per escludere i nodi, è necessario codificarli autonomamente.

+0

Mi chiedo se sia proprio vero. Potrebbero esserci alcuni database in cui il lato sinistro ('val') viene valutato una sola volta per' between', ma sarebbe valutato due volte per due confronti. –

+0

@GordonLinoff Non posso dire che sia universale, ma sui database che uso, l'esecuzione di EXPLAIN rivela che 'a tra xey è eseguito come' a> = x e a <= y'. – BellevueBob