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?
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) );