nny*_*yby 42 sql postgresql exists plpgsql postgresql-9.1
我正在PL/pgSQL中编写一个函数,我正在寻找检查行是否存在的最简单方法.
现在我正在选择一个integer进入a 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;
Run Code Online (Sandbox Code Playgroud)
更新 - 我现在正在做这样的事情:
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;
Run Code Online (Sandbox Code Playgroud)
Erw*_*ter 120
更简单,更短,更快: EXISTS.
IF EXISTS (SELECT 1 FROM people p WHERE p.person_id = my_person_id) THEN
-- do something
END IF;
Run Code Online (Sandbox Code Playgroud)
查询计划程序可以在找到的第一行停止 - 相反count(),它将扫描所有匹配的行,无论如何.与大桌子有所不同.对于唯一列上的条件几乎不重要 - 无论如何只有一行符合条件(并且有一个索引可以快速查找它).
在下面的评论中改进了来自@a_horse_with_no_name的输入.
你甚至可以使用一个空SELECT列表:
IF EXISTS (SELECT FROM people p WHERE p.person_id = my_person_id) THEN ...
Run Code Online (Sandbox Code Playgroud)
由于该SELECT清单与结果无关EXISTS.只有至少一个符合条件的行存在才重要.
小智 7
使用计数(*)
declare
cnt integer;
begin
SELECT count(*) INTO cnt
FROM people
WHERE person_id = my_person_id;
IF cnt > 0 THEN
-- Do something
END IF;
Run Code Online (Sandbox Code Playgroud)
编辑(针对未阅读该声明的投反对票的人和其他可能正在做类似事情的人)
该解决方案仅有效,因为列上有一个 where 子句(并且该列的名称表明它是主键 - 因此 where 子句非常有效)
由于该where子句,无需使用 LIMIT 或其他内容来测试由其主键标识的行是否存在。这是测试这一点的有效方法。
| 归档时间: |
|
| 查看次数: |
83032 次 |
| 最近记录: |