web-dev-qa-db-fra.com

PL / pgSQL vérifiant si une ligne existe

J'écris une fonction en PL/pgSQL, et je cherche le moyen le plus simple de vérifier si une ligne existe.
En ce moment, je sélectionne un integer dans un boolean, ce qui ne fonctionne pas vraiment. Je n'ai pas encore assez d'expérience avec PL/pgSQL pour savoir la meilleure façon de le faire.

Voici une partie de ma fonction:

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 - Je fais quelque chose comme ça pour l'instant:

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

Plus simple, plus court, plus rapide:EXISTS .

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

Le planificateur de requêtes peut s'arrêter à la première ligne trouvée - par opposition à count(), qui analysera toutes les lignes correspondantes malgré tout. Fait la différence avec les grandes tables. Peu importe avec une condition sur une colonne unique - une seule ligne est de toute façon admissible (et il existe un index pour la rechercher rapidement).

Amélioré avec l'entrée de @ a_horse_with_no_name dans les commentaires ci-dessous.

Vous pouvez même utiliser une liste SELECT vide:

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

Étant donné que la liste SELECT n'est pas pertinente pour le résultat de EXISTS. Seule l’existence d’au moins une ligne qualifiante compte.

116
Erwin Brandstetter

Utiliser le nombre (*)

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

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

Modifier (pour l'électeur qui n'a pas lu la déclaration et d'autres qui pourraient faire quelque chose de similaire)

La solution est uniquement efficace car il existe une clause where sur une colonne (et le nom de la colonne suggère que c'est la clé primaire - donc la clause where est très efficace)

En raison de cette clause where, il n'est pas nécessaire d'utiliser une LIMIT ou autre chose pour tester la présence d'une ligne identifiée par sa clé primaire. C'est c'est un moyen efficace de tester cela.

3