it-swarm.com.de

PL / pgSQL prüft, ob eine Zeile existiert

Ich schreibe eine Funktion in PL/pgSQL und suche nach dem einfachsten Weg, um zu überprüfen, ob eine Zeile existiert.
Im Moment wähle ich ein integer in ein boolean, was nicht wirklich funktioniert. Ich habe noch nicht genug Erfahrung mit PL/pgSQL, um zu wissen, wie das am besten funktioniert.

Hier ist ein Teil meiner Funktion:

DECLARE person_exists boolean;
BEGIN

person_exists := FALSE;

SELECT "person_id" INTO person_exists
  FROM "people" p
WHERE p.person_id = my_person_id
LIMIT 1;

IF person_exists THEN
  -- Do something
END IF;

END; $$ LANGUAGE plpgsql;

pdate - Ich mache im Moment so etwas:

DECLARE person_exists integer;
BEGIN

person_exists := 0;

SELECT count("person_id") INTO person_exists
  FROM "people" p
WHERE p.person_id = my_person_id
LIMIT 1;

IF person_exists < 1 THEN
  -- Do something
END IF;
39
nnyby

Einfacher, kürzer, schneller:EXISTS .

IF EXISTS (SELECT 1 FROM people p WHERE p.person_id = my_person_id) THEN
  -- do something
END IF;

Der Abfrageplaner kann an der ersten gefundenen Zeile anhalten - im Gegensatz zu count(), bei dem alle übereinstimmenden Zeilen unabhängig voneinander durchsucht werden. Macht bei großen Tischen einen Unterschied. Bei einer Bedingung für eine eindeutige Spalte ist dies kaum von Bedeutung - es ist ohnehin nur eine Zeile qualifiziert (und es gibt einen Index, mit dem Sie schnell nachschlagen können).

Verbessert mit Eingabe von @ a_horse_with_no_name in den Kommentaren unten.

Sie könnten sogar eine leere SELECT Liste verwenden:

IF EXISTS (SELECT FROM people p WHERE p.person_id = my_person_id) THEN ...

Da die Liste SELECT für das Ergebnis von EXISTS nicht relevant ist. Es kommt nur auf das Vorhandensein mindestens einer qualifizierenden Reihe an.

116

Anzahl verwenden (*)

declare 
   cnt integer;
begin
  SELECT count(*) INTO cnt
  FROM people
  WHERE person_id = my_person_id;

IF cnt > 0 THEN
  -- Do something
END IF;

Edit (für den Abwähler, der die Aussage nicht gelesen hat, und andere, die möglicherweise etwas Ähnliches tun)

Die Lösung ist nur wirksam, da eine Spalte eine where-Klausel enthält (und der Name der Spalte darauf hindeutet, dass es sich um den Primärschlüssel handelt - also um die where-Klausel) ist sehr effektiv)

Aufgrund dieser where -Klausel ist es nicht erforderlich, ein LIMIT oder etwas anderes zu verwenden, um das Vorhandensein einer Zeile zu testen, die durch ihren Primärschlüssel identifiziert wird. Es ist ist ein effektiver Weg, dies zu testen.