En mulighed ville være noget i retning af:
select the_value,
abs(the_value - 14) as distance_from_test
from the_table
order by distance_from_test
limit 1
For at vælge en tilfældig post kan du tilføje , rand()
til order by
klausul. Ulempen ved denne metode er, at du ikke får nogen fordel af indekser, fordi du skal sortere på den afledte værdi distance_from_test
.
Hvis du har et indeks på the_value
og du slækker på dit krav om, at resultatet skal være tilfældigt i tilfælde af ligheder, kan du udføre et par forespørgsler med begrænset rækkevidde for at vælge den første værdi umiddelbart over testværdien og den første værdi umiddelbart under testværdien og vælge den, der er tættest på til testværdien:
(
select the_value
from the_table
where the_value >= 14
order by the_value asc
limit 1
)
union
(
select the_value
from the_table
where the_value < 14
order by the_value desc
limit 1
)
order by abs(the_value - 14)
limit 1