Во-первых, если вы хотите равенства, вам нужно равенство:
SELECT *
FROM my_table
WHERE my_float_column >= 0.1234
LIMIT 1
В противном случае вы никогда не получите 0.5
, если передадите 0.5
. Также обратите внимание, что представления с плавающей запятой могут быть сложными для сравнения. 0.5 имеет точное представление, но большинство других значений являются приближениями, которые могут вызвать проблемы для сравнений на равенство. , , но я собираюсь игнорировать это.
Значения с плавающей точкой также не годятся для представления равномерного распределения. Существует намного больше чисел с плавающей запятой (как представлено в типе данных) между 0 и 0,00001, чем между 0,99999 и 1,00000. Числа с фиксированной точкой могут быть лучшим представлением в таком диапазоне.
И все это говорит о том, что на самом деле ваш вопрос - это случайность для равных значений. Во-первых, ваш метод имеет недостатки, потому что вы просто возвращаете любое значение, большее, чем вы хотите. Это более правильно:
SELECT *
FROM my_table
WHERE my_float_column >= 0.1234
ORDER BY my_float_column DESC
LIMIT 1;
И, чтобы получить случайность, используйте rand()
в качестве второго ключа:
ORDER BY my_float_column, rand()
Для производительности я бы порекомендовал индекс на my_float_column
. rand()
является фактором снижения производительности, поскольку он запрещает использование индекса, но вы можете изменить запрос:
SELECT t.*
FROM my_table t
WHERE t.my_float_column >= 0.1234 AND
t.my_float_column <= (SELECT COALESCE(MIN(t2.my_float_column), t.my_float_column))
FROM my_table t2
WHERE t2.my_float_column > 0.1234
)
ORDER BY my_float_column DESC, rand()
LIMIT 1;