Du kannst Dir dafür eine Sequence erzeugen und Dein Resultat mit mit nextval() von dieser Sequence versehen.
Angenommen, Du hast eine Table words mit der Spalte w, text. Davon alle Einträge, die mit a anfangen, sortiert und nummeriert.
test=*# create sequence foobar;
CREATE SEQUENCE
test=*# select nextval('foobar'), w from (select w from words where w ~ '^a' order by 1)bar;
Beachte, daß beim nächsten Aufruf die Sequence bereits einen Startwert hat. Als Verbesserung zu meinem Beispiel benutze eine temp. Sequence. Alternativ: schreib eine SRF.
Würd das gerne sicher mit der Funktion machen, weiß nur nicht wie ich das angehen soll?
Von wegen Syntax
Steht in der Doku. Beispiel:
test=# create table foo (name text);
CREATE TABLE
Time: 148.425 ms
test=*# insert into foo values ('magdalena');
INSERT 0 1
Time: 1.405 ms
test=*# insert into foo values ('katharina');
INSERT 0 1
Time: 0.954 ms
test=*# insert into foo values ('tamara');
INSERT 0 1
Time: 1.042 ms
test=*# commit;
COMMIT
test=# select * from foo order by 1;
name
-----------
katharina
magdalena
tamara
(3 rows)
Time: 1.515 ms
test=*# create or replace function get_foo(OUT _c int, out _name text) returns setof record as $$declare rec record; c int; begin c:=0; for rec in select name from foo order by 1 loop _c := c; c:=c+1;_name=rec.name; return next; end loop; end; $$ language plpgsql;
CREATE FUNCTION
Time: 130.938 ms
test=*# select * from get_foo();
_c | _name
----+-----------
0 | katharina
1 | magdalena
2 | tamara
(3 rows)
Time: 46.875 ms
test=*#
ERROR: function result type must be integer because of OUT parameters
funktion dazu :
create or replace function numerieren (text, float, out out_anzahl integer) returns setof record as $$
declare
foo record;
begin
for foo in select count(*) as anzahl from zuordnung where dialcode=$1 preis <= $2 loop
out_anzahl=foo.anzahl;
return next;
end loop;
return;
end; $$ language 'plpgsql'
okay das and hab ich vergessen, tut aber nichts zur Sache bei dem Fehler.
Der kommt nämlich schon wenn ich die Funktion überhaupt createn möchte
Weil ich möchte bestimmte einträge durchnummerieren.
Zum beispiel hab ich 3 ma den artikel 105 und jetzt will ich die nach Preis durchnummerieren. Das ich mir dann sagen kann. Okay, wenns den Artikel 105 im Aldi nicht mehr gibt, hol ich ihn im Lidl, weil der der 2t billigste ist und wenns den auch da nemmer gibt dann im 3ten also im Penny … so zum beispiel.
danke das klappt jetzt =)
aber wie bekomm ichs jetzt noch auf die Reihe das mit anderen Daten auszugeben?
Weil ich lasse mir ja von der funktion nur eine Zahl ausgeben und kann die ja nicht irgendwie Jointen oder so ? gibts da nen Trick bei funktionen?
Weil wenn ich sage Select Artikel, Supermarkt, Preis from Supermarkt_liste
order by Artikel, Preis
dann hab ich ja keine Parameter für die Funktion?
Oder kann ich eine Funktion auch mehr als einen Typen ausgeben lassen?
Weil dann würde ich die Werte einfach aus der anderen Tabelle durchschleifen
Was muss ich dann hinschreiben bei record bzw int ?
Sorry das ich mich so dumm anstelle, aber ich muss erst ma in Funktionen rein kommen.
okay die funktion da ist alles Tutti, bis auf, das sie das ergebnis des select befehls immer als 0 ausgibt ??
aber wie ruf ich die jetzt für jede Zeile korrekt auf?
Select * from numerieren(select name,ort,alter from namensliste)
wäre das was ich wollte, geht aber natürlich nicht
meine funktion
create or replace function
numerieren(text,text,float, out name text, out ort text, OUT alter int, out counter int)
returns setof record as
$$declare rec record;
begin
for rec in select count(*) as anzahl from namensliste
where alter<=$3 and name=$1 loop
counter := anzahl;
name := $1;
ort := $2;
alter := $3;
return next;
end loop;
end;
$$ language plpgsql;