Zufälligen Datensatz lesen

Hi,

Ich versuche einen Zufälligen Datensatz zu lesen. Die Funktion wird mit eine Suchbegriff aufgerufen. Ein DS der zum Suchbegriff passt soll gelesen werden. Existieren mehrere DS, so soll per Zufall ein DS ausgewählt werden.

Existiert zum Suchbegriff kein DS, so soll einfach ein bel. DS zurückgeliefert werden.

So habe ich es probiert:

CREATE OR REPLACE FUNCTION tfeld (such varchar, stufe int) 
returns table (id int, erg int) AS $$
DECLARE 
 c_heute  varchar;
 erg      int;
 sqlex    varchar;
 stufeflag int;
 pos      int;
 
BEGIN
 c_heute= to_char(now(), 'YYYYmmdd');
 stufeflag=POWER(2,(stufe));
 sqlex='SELECT ID FROM tabelle WHERE s LIKE ''%'||such||'%'' AND ((stufe & '||stufeflag||')<>0) AND '||c_heute||' BETWEEN von AND bis';
 EXECUTE sqlex;
 GET DIAGNOSTICS erg = ROW_COUNT;
 
 --wenn nichts gefunden, dann einfach alle DS holen
 IF erg=0 then
  sqlex='SELECT ID FROM tabelle WHERE ((stufe & '||stufeflag||')<>0) AND '||c_heute||' BETWEEN von AND bis';
  EXECUTE sqlex;
  GET DIAGNOSTICS erg = ROW_COUNT;
 end if;
 
 --wenn mehr als ein DS gefunden wurde, dann muß ein DS ausgewählt werden!
 if erg>1 then
  pos= 1+((random()*erg-1+1))::integer;
 else
  pos=1;
 end if;
 
 -- hier müsste ich jetzt die ID des pos-ten Datensatzes auslesen
 
 return query select pos, erg;
 
END;
 
$$ LANGUAGE plpgsql;

Wie kann ich jetzt die ID zum posten Datensatz auslesen? Ich vermute mal das geht so nicht.

Ich habe es dann per Cursor versucht:

OPEN crsr FOR SELECT ID FROM tabelle
MOVE FORWARD 2 IN crsr;
FETCH crsr INTO xid;
close crsr;

Das klappt nur teilweise. Ich muss dem OPEN-Befehl ja eigentlich noch angeben wonach selektiert werden soll. Sobalt ich aber den Selectstring zusammensetze, bekomme ich Fehlermeldungen (z. B.
FEHLER: ungültige Eingabesyntax für ganze Zahl: »||c_heute||«; Error while executing the query)

Wie kann ich den SELECT-String für OPEN zusammensetzen und wie kann ich rausfinden, wieviele Zeilen der Cursor enthält? Mit ROW_COUNT bekomme ich immer nur 1 zurück.

Was gefällt Dir an

ORDER BY RANDOM() LIMIT 1

eigentlich nicht?

Andreas

Hallo Andreas,

danke für den Hinweis. Dass ich random() auch hinter order by angeben darf habe ich noch nicht gewusst.

Ich habe gerade auch eine Lösung für das Zusammensetzen des Abfragestrings gefunden. Für dieses Problem brauche ich das zwar nicht mehr, aber es warten ja noch mehrere Funktionen, die ich erstellen muss.

Mit:

strex:='SELECT ID FROM tabelle WHERE s LIKE ''%'||such||'%'' AND ((stufe & '||stufeflag||')<>0) AND '||c_heute||' BETWEEN von AND bis';
OPEN crsr FOR EXECUTE strex;

funktioniert das schon mal.

Bliebe noch die Frage, wie ich die Anzahl der Zeilen eines Cursors auslesen kann.

Danke.