Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

156
Vistas
¿Hay alguna manera de mezclar @variables con marcadores de posición en Perl usando DBI y MySQL/MyISAM?

Tengo una consulta como esta:

 SELECT foo.bar FROM foo WHERE foo.bang = 0 AND ( CASE WHEN ? = 2 THEN foo.baz IS NOT NULL WHEN ? = 1 THEN foo.baz IS NULL ELSE ? NOT IN (1, 2) END ) AND ( (? = 0) OR (foo.bang = ?) )

donde los marcadores de posición ( ? ) se utilizan como entradas para los parámetros de filtro:

 my $query = $aboveQuery; my ( $results ) = $dbh->DBI::db::selectall_arrayref( $query, { Slice => {} }, $bazFilter, $bazFilter, $bazFilter, $bangFilter, $bangFilter, );

Esto funciona, pero no es muy fácil de leer.
MySQL admite variables @ , lo que aumentaría la legibilidad:

 SET @bazFilter = ?; -- passed in via selectall_arrayref or execute; SET @bangFilter = ?; SELECT foo.bar FROM foo WHERE foo.bang = 0 AND ( CASE WHEN @bazFilter = 2 THEN foo.baz IS NOT NULL WHEN @bazFilter = 1 THEN foo.baz IS NULL ELSE @bazFilter NOT IN (1, 2) END ) AND ( (@bangFilter = 0) OR (foo.bang = @bangFilter) );

Me gustaría hacer algo como esto en su lugar:

 my $query = $aboveAtVariablizedQuery; my ( $results ) = $dbh->DBI::db::selectall_arrayref( $query, { Slice => {} }, $bazFilter, $bangFilter, );

pero MyISAM aparentemente no hará múltiples declaraciones en una sola consulta.

Mi google-fu me está fallando.
¿Hay una buena manera de mezclar y combinar las @variables con los marcadores de posición?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Realice cada declaración por separado, utilizando no execute uno de los métodos de obtención.

Las variables @ son locales para la conexión, por lo que no hay problema con la contaminación entre subprocesos.

Si el objetivo es tener una sola consulta sin sustituciones repetidas, entonces considere:

 SELECT foo.bar FROM ( SELECT baz = ?, bang = ? ) AS init JOIN foo WHERE foo.bang = 0 AND ( CASE WHEN init.baz = 2 THEN foo.baz IS NOT NULL WHEN init.baz = 1 THEN foo.baz IS NULL ELSE init.baz NOT IN (1, 2) END ) AND ( (init.bang = 0) OR (foo.bang = init.bang) );
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda