Variablen in Abfrage

Ludwigmller

SQL-Guru
Beiträge
168
Hi,
ist es möglich Variablen in einer Abfrage zu nutzen?
Ich habe derzeit mehrfach
Code:
col1 * col2
in einem Select-Statement und würde dieses gerne einmal als
Code:
produkt
definieren und an allen Stellen im Statement nutzen können. Bei Änderungen müsste dann nur eine Stelle angepasst werden, statt im gesamten Statement zu suchen.

Welche Möglichkeiten gibt es?
 
Werbung:
mittels einer Funktion unter Umständen?
Code:
create or replace function x(x integer, y integer) returns integer as $$
select x*y;
$$ language sql;

x und y sind 2 variablen ;)

probieren, ob es funktioniert:
Code:
select x(4, 5);

Returns:
Code:
 x
----
 20

als Beispiel mit einer Tabelle dazu:
Code:
create table nums(x integer, y integer);

ein paar Werte einfügen:
Code:
insert into nums(x, y) values (2, 3);
insert into nums(x, y) values (3, 4);
insert into nums(x, y) values (4, 5);

Und jetzt eine Abfrage:
Code:
select x(x, y) from nums;

Returns:
Code:
 x
----
  6
 12
 20
 
schreib mal bitte, welche Tabellen du hast, und was du aus diesen lesen möchtest.

Ein paar Ideen:
1.: Eine Trigger-Procedure, die die Tabelle updated (denke ich relativ falsch)
2.: Eine View, die auf die Tabelle zugreift, und nur der Faktor in der View geändert werden muss
3.: Ein allgemeines Update (?)
 
Ich meinte das etwas allgemeiner. Es geht dabei hautpsächlich um die Entwicklungsphase einer komplexeren Abfrage. Wenn man dabei ist die Berechnung einer Spalte zu schreiben und zu testen, kann es Fehler und Zeit ersparen, wiederkehrende Ausdrücke einmal zu definieren und dann als Variable zu verwenden, vorausgesetzt diese Möglichkeit gibt es so.

Hier mal eine kleine Abfrage als Beispiel:
Code:
Select
    b.datum,
    case b.datum < z.beginn then b.anzahl * b.kg end as "zuFrueh",
    case b.datum > z.ende then b.anzahl * b.kg end as "zuSpaet",
    case b.datum > z.beginn and b.datum < z.ende then b.anzahl *b.kg end as "imZeitraum"   
From
bestellungen b, zeitraum z
In diesem Fall würde ich gerne
Code:
b.anzahl *b.kg
durch eine Variable ersetzen können
 
Du kannst CTE's verwenden. Die Syntax scheint falsch zu sein, hab es aber nicht getestet. Und ja, das Caching in PG ist besser als Du es scheinbar vermutest.
 
Werbung:
Man kann Selects ohne Probleme schachteln, das bedeutet meist nicht, dass sie langsamer werden, z.B.:
Code:
Select
   b.datum,
   case b.datum < z.beginn then AnzahlKG end as "zuFrueh",
   case b.datum > z.ende then AnzahlKG end as "zuSpaet",
   case b.datum > z.beginn and b.datum < z.ende then AnzahlKG end as "imZeitraum"   
From
(Select Datum, anzahl*kg as AnzahlKG, Beginn, Ende from bestellungen) b, zeitraum z *
An der Stelle verweise ich mal auf den anderen Thread "Namenskonventionen". Eine View bietet sich an, solche Berechnungen zentral mitzuliefern. Änderungen funktionieren dann relativ problemlos, selbst wenn sich das halbe Datenmodell innerhalb des Views ändert und nicht nur ein paar Formelberechnungen.

* Wie schon von akretschmer angemerkt, hier gibt es kein Join Kriterium, ist aus der Vorlage übernommen. Muss nicht falsch sein, aber kann es durchaus-...
 
Zurück
Oben