2012-05-10 21 views
5

consideran una consulta que se ve algo como esto:argumentos repetidos en una declaración preparada


my $query=<<QUERY; 

select * from foo1 where col < ? 
union all 
select * from foo2 where col < ? 
QUERY 

Supongamos que la consulta real realmente necesita sindicatos y no puede ser resuelto de manera eficiente por otro camino. La variable en la cláusula where siempre será la misma. ¿Hay alguna forma de que pueda estructurar esto para que solo tenga que pasar 1 argumento para ejecutar en lugar de pasar el mismo argumento dos veces?

Respuesta

4

se puede utilizar el operador de la lista de repetición.

$sth->execute(($value) x 2); 
4

En las bases de datos "reales", puede parametrizar una consulta y pasarla como argumento. Aquí hay una solución alternativa:

with const as (select ? as val) 
select * 
from ((select foo1.* 
     from foo1 cross join const 
     where col < const.val 
    ) union all 
     (select foo2.* 
     from foo2 cross join const 
     where col < const.val 
    )) t 

No estoy sugiriendo que esto sea necesariamente una buena idea. Sin embargo, a veces he encontrado que es bastante útil reunir parámetros en dicha subconsulta y luego unirlos cuando sea necesario.

3

podría intentar lo siguiente, estoy asumiendo que usted está pasando un entero a la cláusula where ...

DECLARE @variableName as int 

SET @variableName = ? --the value gets passed here once 

select * from foo1 where col < @variableName -- and gets used here 
union all 
select * from foo2 where col < @variableName -- and here! 
Cuestiones relacionadas