tutorial - PL/pgSQL comprobando si existe una fila
programacion en postgresql (2)
Más simple, más corto, más rápido: EXISTS
.
IF EXISTS (SELECT 1 FROM people WHERE person_id = my_person_id) THEN
-- do something
END IF;
El planificador de consultas puede detenerse en la primera fila encontrada, a diferencia de count()
, que analizará todas las filas coincidentes independientemente. Hace una diferencia con las mesas grandes. Apenas importa una condición en una columna única: solo una fila califica de todos modos (y hay un índice para buscarla rápidamente).
Mejorado con la entrada de @a_horse_with_no_name en los comentarios a continuación.
Estoy escribiendo una función en PL / pgSQL, y estoy buscando la forma más sencilla de verificar si existe una fila.
En este momento estoy SELECCIONANDO un integer
en un boolean
, que realmente no funciona. Todavía no tengo experiencia con PL / pgSQL para saber la mejor manera de hacerlo.
Aquí hay parte de mi función:
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;
Actualización : estoy haciendo algo como esto por ahora:
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;
Usar recuento (*)
declare
cnt integer;
begin
SELECT count(*) INTO cnt
FROM people
WHERE person_id = my_person_id;
IF cnt > 0 THEN
-- Do something
END IF;
Editar (para el infractor que no leyó la declaración y otros que podrían estar haciendo algo similar)
La solución solo es efectiva porque hay una cláusula where en una columna (y el nombre de la columna sugiere que es la clave principal, por lo que la cláusula where es altamente efectiva)
Debido a esa cláusula where
no es necesario usar un LIMIT o alguna otra cosa para probar la presencia de una fila identificada por su clave principal. Es una forma efectiva de probar esto.