Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

154
Views
¿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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!