PL / pgSQL检查是否存在行

问题描述 投票:38回答:2

我正在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;
sql postgresql plpgsql postgresql-9.1 exists
2个回答
111
投票

更简单,更短,更快:EXISTS

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

查询计划程序可以在找到的第一行停止 - 而不是count(),它将扫描所有匹配的行,无论如何。与大桌子有所不同。对于唯一列上的条件几乎不重要 - 无论如何只有一行符合条件(并且有一个索引可以快速查找它)。

在下面的评论中改进了@a_horse_with_no_name的输入。

你甚至可以使用一个空的SELECT列表:

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

由于SELECT列表与EXISTS的结果无关。只有至少一个符合条件的行存在才重要。


2
投票

使用次数(*)

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和可能正在做类似事情的其他人)

该解决方案仅有效,因为列上有where子句(并且列的名称表明它是主键 - 因此where子句非常有效)

由于该where子句,不需要使用LIMIT或其他东西来测试由其主键标识的行的存在。这是一种有效的测试方法。

© www.soinside.com 2019 - 2024. All rights reserved.