2012-05-10 3 views
5

betrachten eine Abfrage, die etwa wie folgt aussieht:Wiederholte Argumente in einer vorbereiteten Erklärung


my $query=<<QUERY; 

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

wird angenommen, dass die eigentliche Abfrage benötigt Gewerkschaften wirklich und nicht effizient eine andere Art und Weise gelöst werden. Die Variable in der WHERE-Klausel wird immer dieselbe sein. Gibt es eine Möglichkeit, das so zu strukturieren, dass ich nur 1 Argument ausführen muss, anstatt das gleiche Argument zweimal zu übergeben?

Antwort

4

Sie die Liste Wiederholungsoperator verwenden könnte.

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

In "echten" Datenbanken können Sie eine Abfrage parametrisieren und die Abfrage als Argument übergeben. Hier ist eine alternative Lösung:

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 

Ich schlage nicht vor, dass dies notwendig ist eine gute Idee. Allerdings habe ich es manchmal als nützlich empfunden, Parameter in eine solche Unterabfrage einzutragen und sie dann bei Bedarf zu verbinden.

3

könnte folgende versuchen, ich nehme an, Sie vorbei sind eine ganze Zahl zu der Klausel 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! 
Verwandte Themen