sql - tablas - para que es la libreria pandas
¿Hay un enlace de parámetro SQL para matrices? (8)
Con DBI
simple, usted debería construir el SQL usted mismo, como se sugirió anteriormente. DBIx :: Simple (un contenedor para DBI
) hace esto para usted automáticamente usando el ''??'' notación:
$db->query("select * from foo where bar in (??)", @values);
¿Existe una forma estándar de vincular matrices (de escalares) en una consulta SQL? Quiero enlazar a una cláusula IN
, así:
SELECT * FROM junk WHERE junk.id IN (?);
Resulta que estoy usando Perl::DBI
que coacciona los parámetros a escalares, así que termino con consultas inútiles como:
SELECT * FROM junk WHERE junk.id IN (''ARRAY(0xdeadbeef)'');
Aclaración: pongo la consulta en su propio archivo .sql
, por lo que la cadena ya está formada. Cuando las respuestas mencionen la creación dinámica de la cadena de consulta probablemente realice una búsqueda y la reemplace.
Editar: ¿ Esta pregunta es una especie de duplicado de la cláusula Parameterizing a SQL IN? . Originalmente pensé que debería cerrarse como tal, pero parece que está acumulando una buena información específica de Perl.
En Python, siempre he terminado haciendo algo como:
query = ''select * from junk where junk.id in (''
for id in junkids:
query = query + ''?,''
query = query + '')''
cursor.execute(query, junkids)
... que esencialmente genera una consulta con uno ''?'' para cada elemento de la lista.
(y si hay otros parámetros allí también, debe asegurarse de alinear correctamente las cosas cuando ejecuta la consulta)
[edit para hacer que el código sea más fácil de entender para las personas que no son python. Hay un error, donde la consulta tendrá una coma adicional después de la última?, Que dejaré porque arreglarlo simplemente nublaría la idea general]
Yo hago algo como:
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 );
Yo uso DBIx :: DWIW . Contiene una función llamada InList (). Esto creará la parte del SQL que se necesita para la lista. Sin embargo, esto solo funciona si tiene todo su SQL en el programa en lugar de afuera en un archivo separado.
Usted especifica "este es el SQL para una consulta con un parámetro" - eso no funcionará cuando quiera muchos parámetros. Es un dolor tratar, por supuesto. Otras dos variaciones a lo que ya se sugirió:
1) Use DBI-> cita en lugar de marcadores de posición.
my $sql = "select foo from bar where baz in ("
. join(",", map { $dbh->quote($_) } @bazs)
. ")";
my $data = $dbh->selectall_arrayref($sql);
2) Use un ORM para hacer este tipo de cosas de bajo nivel para usted. DBIx :: Class o Rose :: DB :: Object, por ejemplo.
Si no te gusta el mapa allí, puedes usar el operador ''x'':
my $params = join '', '' => (''?'') x @foo;
my $sql = "SELECT * FROM table WHERE id IN ($params)";
my $sth = $dbh->prepare( $sql );
$sth->execute( @foo );
Los paréntesis son necesarios alrededor del ''?'' porque eso fuerza a ''x'' a estar en el contexto de la lista.
Lea "perldoc perlop" y busque "Binary" x "''para obtener más información (está en la sección" Operadores multiplicadores ").
Y otra forma más de construir SQL es usar algo como SQL :: Resumen ...
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 ( ?, ?, ? ) )
Utilizar
SELECT * FROM junk WHERE junk.id = ANY (?);
en lugar