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でプレースホルダーを使用する場合、クエリをどのように形成する必要がありますか?