postgresql PL/pgSQL检查行是否存在

cetgtptt  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(2)|浏览(192)

我正在用PL/pgSQL编写一个函数,我正在寻找检查行是否存在的最简单方法。
现在我正在将一个integer选择为一个boolean,这实际上并不起作用。我对PL/pgSQL还没有足够的经验,不知道最好的方法。
这是我的函数的一部分:

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;

字符串

  • 更新 * -我现在正在做这样的事情:
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;

zf2sa74q

zf2sa74q1#

更简单,更短,* 更快:* EXISTS**。

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

字符串
查询规划器可以在找到的第一行停止-与count()相反,count()扫描所有(符合条件的)行。对于大表有很大的区别。对于唯一列的条件,区别很小:只有一行符合条件,并且有一个索引可以快速查找它。
SELECT列表可以是空的--事实上,这是最短和最便宜的。(其他一些RDBMS不允许主体上有空的SELECT列表。)

cdmah0mi

cdmah0mi2#

使用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;

字符串

编辑(对于没有阅读声明的downvoter和其他可能正在做类似事情的人)

这个解决方案是 only 有效的,因为列上有一个where子句(列的名称表明它是主键-所以where子句非常有效)
因为有了where子句,所以不需要使用LIMIT或其他东西来测试是否存在由主键标识的行。这是一种有效的测试方法。

相关问题