是否有一种标准的方法来绑定SQL查询中的数组(标量)?我想绑定到一个IN
子句,如下所示:
SELECT * FROM junk WHERE junk.id IN (?);
我碰巧使用了Perl::DBI
哪些强制参数到标量,所以我最终得到了无用的查询,例如:
SELECT * FROM junk WHERE junk.id IN ('ARRAY(0xdeadbeef)');
澄清:我将查询放在自己的.sql
文件中,因此字符串已经形成.如果答案提到动态创建查询字符串,我可能会进行搜索并替换.
编辑:这个问题有点像参数化SQL IN子句?.我原本以为它应该被关闭,但似乎它正在累积一些特定的Perl特定信息.
如果您不喜欢那里的地图,可以使用'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"并搜索"Binary"x"'以获取更多信息(它位于"乘法运算符"部分).
您指定"这是具有一个参数的查询的SQL" - 当您需要许多参数时,这将不起作用.当然,这是一个痛苦的处理.已经提出的另外两个变化:
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.
我做的事情如下:
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 );
另一种构建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 ( ?, ?, ? ) )