4

我想知道,为什么我使用 DBI 在 Perl 代码中形成的查询没有返回正确的记录。我有简单的查询,例如:

my $query = "SELECT id FROM table WHERE title = ? AND price = ?";

我像这样执行它:

my $sth = $dbh->prepare( $query );
my ($id) = $dbh->selectcol_arrayref( $sth, undef, $title, $price );

大多数时候一切正常,但在极少数情况下,我没有得到预期的结果。所以我也从 CLI 尝试过。具有可疑值的完整查询:

SELECT id FROM table WHERE title = 'Some title' AND price = 1.66;

并获得了想要的记录。之后我也引用了价格:

SELECT id FROM table WHERE title = 'Some title' AND price = '1.66';

结果是记录。

之后,我尝试了其他报价值,例如“1.67”,它们运行良好。

这里有什么问题?为什么这样简单的查询会失败?为了重现行为,我将简单的模式和查询放到sqlfiddle 上,如您所见,简单的查询SELECT * FROM Table1 WHERE price = '1.66' OR price = '1.67';只给出一个结果。

我觉得,这可能与双数据类型的性质有关(1.66 表示为 1.66666666...?),但是当我在 DBI 中使用占位符时,我应该如何形成我的查询?

4

1 回答 1

9

您永远不应该比较浮点数是否相等。您应该使用公差。numeric要么使用容差,要么从浮点数切换(到text或 中的分integer)。

于 2012-10-25T19:54:49.510 回答