「バリアディック」が実際に正しい言葉かどうかはわかりませんが、値のリストを取ることができるものについて話しているIN()
. 長い間 DBI を使用してきた場合は、おそらく次のことを試みたことがあるでしょう:
(注: 簡潔にするために、すべての例は非常に単純化されています)
my $vals = join ', ', @numbers;
my $sth = $dbh->prepare( "SELECT * FROM mytbl WHERE foo IN( ? )" );
$sth->execute( $vals ); # doesn't work
?
私の知る限り、DBI プレースホルダーは単にこの種の悪ふざけをサポートしていません。
これにより、次のようなことをすることになります。
my $sth = $dbh->prepare( "SELECT * FROM mytbl WHERE foo IN ( $vals )" );
これはそれほど恐ろしいことではありませんが、今日私が書いたような関数を考えてみてください。この関数は、IN
句と値のリストを含む任意の SQL を受け入れる必要があります。
sub example {
my $self = shift;
my ( $sql, @args ) = @_;
my $vals = join ', ', @args;
$sql =~ s/XXX/$vals/; <---- # AARRRGHGH
my $sth = $self->dbh->prepare( $sql );
...
}
これは最終的に次のようなものによって呼び出されます
my $sql = "SELECT * FROM mytbl WHERE foo IN( XXX ) AND bar = 42 ORDER BY baz";
my $result = $self->example( $sql, @quux );
これは私の美的感覚を本当に傷つけます。プログラムでカスタム SQL を構築することは、それだけでも十分に大きな苦痛です。必要がなければ、SQL 文字列を正規表現する道をたどりたくありません。
より良い方法はありますか?