У меня есть система Joomla, и я пытаюсь изменить поиск так, чтобы он правильно нашел значения с плавающей точкой в базе данных.
Так, у меня есть запрос, который создается во времени выполнения, которое выглядит примерно так:
select 'column1'
from 'some_table'
where 'some_float_field' <=> '2.18'
Это не работает, это никогда ничему не соответствует, даже при том, что я вижу записи в дб с этим значением там.
Таким образом, я пытался просто сделать это вместо этого:
select 'column1'
from 'some_table'
where 'some_float_field' <=> 2.18
Никакая удача, таким образом я пытался бросить к десятичному числу (плавание не работает по некоторым причинам), таким образом, я попробовал это:
select 'column1'
from 'some_table'
where 'some_float_field' <=> CAST('2.18' AS DECIMAL(20, 2))
Провал...
Следует иметь в виду, что> = или <= возвращает надлежащие результаты, просто <=> дает мне проблемы.
Как я заставляю равенство работать здесь?
Обычно с такими вопросами полезно привести небольшой пример для воспроизведения результатов.
Обычно тестирование точных значений с плавающей запятой - плохая идея, так как точность с плавающей запятой не является точной наукой. Гораздо лучше использовать некоторую толерантность.
create table foo1 (col1 float);
insert into foo1 values (2.18);
select * from foo1 where abs(col1-2.18) <= 1e-6
Я нашел способ проверить, что мои пользователи считают равенством.
Мне пришлось преобразовать поле в строку символов и протестировать наборы символов, так что для них это нормально работает:
select 'column1'
from 'some_table'
where CAST('some_float_field' AS CHAR) <=> '2.18'
Рассмотрим следующее:
where abs(some_float_field) - 2.18 < 0.001