PL/pgSQL checking if a row exists

久未见 提交于 2019-11-26 09:02:21

问题


I\'m writing a function in PL/pgSQL, and I\'m looking for the simplest way to check if a row exists.
Right now I\'m SELECTing an integer into a boolean, which doesn\'t really work. I\'m not experienced with PL/pgSQL enough yet to know the best way of doing this.

Here\'s part of my function:

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;

Update - I\'m doing something like this for now:

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;

回答1:


Simpler, shorter, faster: EXISTS.

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

The query planner can stop at the first row found - as opposed to count(), which will scan all matching rows regardless. Makes a difference with big tables. Hardly matters with a condition on a unique column - only one row qualifies anyway (and there is an index to look it up quickly).

Improved with input from @a_horse_with_no_name in the comments below.

You could even use an empty SELECT list:

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

Since the SELECT list is not relevant to the outcome of EXISTS. Only the existence of at least one qualifying row matters.




回答2:


Use count(*)

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 (for the downvoter who didn't read the statement and others who might be doing something similar)

The solution is only effective because there is a where clause on a column (and the name of the column suggests that its the primary key - so the where clause is highly effective)

Because of that where clause there is no need to use a LIMIT or something else to test the presence of a row that is identified by its primary key. It is an effective way to test this.



来源:https://stackoverflow.com/questions/11892233/pl-pgsql-checking-if-a-row-exists

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!