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つの結果しか得られません。

これはdoubleデータ型の性質に関連している可能性があると思います(1.66は1.66666666として表されます...?)が、DBIでプレースホルダーを使用する場合、クエリをどのように形成する必要がありますか?

4

1 に答える 1

9

浮動小数点数が等しいかどうかを比較しないでください。公差を使用する必要があります。許容誤差を使用するか、浮動小数点数から(numerictextまたはのセントにinteger)切り替えます。

于 2012-10-25T19:54:49.510 に答える