21

SQL クエリで (スカラーの) 配列をバインドする標準的な方法はありますか? IN次のように、句にバインドしたいと思います。

SELECT * FROM junk WHERE junk.id IN (?);

私はたまたまPerl::DBIwhich coerces パラメーターをスカラーに使用しているため、次のような役に立たないクエリになってしまいます。

SELECT * FROM junk WHERE junk.id IN ('ARRAY(0xdeadbeef)');

明確化:クエリを独自の.sqlファイルに入れたので、文字列は既に形成されています。答えが動的にクエリ文字列を作成することに言及している場合、代わりに検索と置換を行うでしょう。

編集:この質問は、 SQL IN 句のパラメーター化の複製のようなものですか? . 本来はこのまま閉じるべきだと思っていたのですが、Perl特有の良い情報が蓄積されているようです。

4

8 に答える 8

14

そこのマップが気に入らない場合は、「x」演算子を使用できます。

my $params = join ', ' => ('?') x @foo;
my $sql    = "SELECT * FROM table WHERE id IN ($params)";
my $sth    = $dbh->prepare( $sql );
$sth->execute( @foo );

「?」の前後に括弧が必要です。これは、'x' を強制的にリスト コンテキストにするためです。

詳細については、「perldoc perlop」を読み、「バイナリ "x"」を検索してください (「乗法演算子」セクションにあります)。

于 2009-02-05T11:44:15.787 に答える
12

「これは 1 つのパラメーターを持つクエリの SQL です」と指定すると、多くのパラメーターが必要な場合には機能しません。もちろん、対処するのは苦痛です。すでに提案されたものの他の 2 つのバリエーション:

1) プレースホルダーの代わりに DBI->quote を使用します。

my $sql = "select foo from bar where baz in ("
           . join(",", map { $dbh->quote($_) } @bazs)
           . ")";
my $data = $dbh->selectall_arrayref($sql);

2)ORMを使用して、この種の低レベルの作業を行います。たとえば、DBIx::Class または Rose::DB::Object です。

于 2009-02-05T04:29:32.920 に答える
9

私は次のようなことをします:

my $dbh = DBI->connect( ... );
my @vals= ( 1,2,3,4,5 );
my $sql = 'SELECT * FROM table WHERE id IN (' . join( ',', map { '?' } @vals ) . ')';
my $sth = $dbh->prepare( $sql );
$sth->execute( @vals );
于 2009-02-05T00:53:00.720 に答える
6

そして、SQLを構築するさらに別の方法は、SQL ::Abstract ...のようなものを使用することです。

use SQL::Abstract;
my $sql    = SQL::Abstract->new;
my $values = [ 1..3 ];
my $query  = $sql->select( 'table', '*', { id => { -in => $values } } );

say $query;   # => SELECT * FROM table WHERE ( id IN ( ?, ?, ? ) )
于 2009-02-05T20:17:28.153 に答える
4

上記のように、 plainDBIでは SQL を自分で作成する必要があります。DBIx::Simple ( のラッパーDBI) は、'??' を使用して自動的にこれを行います。表記:

$db->query("select * from foo where bar in (??)", @values);
于 2009-02-05T11:25:08.227 に答える
2

Pythonでは、私はいつも次のようなことをしてきました:

query = 'select * from junk where junk.id in ('
for id in junkids:
  query = query + '?,'
query = query + ')'

cursor.execute(query, junkids)

...これは基本的に、1 つの「?」でクエリを作成します。リストの各要素に対して。

(そして、そこに他のパラメーターもある場合は、クエリを実行するときに、正しく整列していることを確認する必要があります)

[Python 以外の人にとってコードを理解しやすくするために編集します。クエリが最後の ? の後に余分なカンマを持つバグがあります。

于 2009-02-04T23:22:25.320 に答える
0

DBIx::DWIWを使用しています。InList()という関数が含まれています。これにより、リストに必要なSQLの部分が作成されます。ただし、これは、外部の別のファイルではなく、プログラムにすべてのSQLがある場合にのみ機能します。

于 2009-02-05T12:57:49.243 に答える