我正在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;
答案 0 :(得分: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
的结果无关。只有至少一个符合条件的行才存在。
答案 1 :(得分:2)
使用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和其他可能正在做类似事情的人)
解决方案仅有效,因为列上有where子句(并且列的名称表明它是主键 - 所以where子句非常有效)
由于该where
子句,不需要使用LIMIT或其他东西来测试由其主键标识的行的存在。 是测试此功能的有效方法。