如何根据select语句结果创建一个返回布尔值的函数

时间:2016-12-07 20:14:44

标签: sql postgresql function plpgsql select-case

我有一个表(Id,FK,Date1,Date2),我需要创建一个返回布尔值的函数。通常我想选择与给定FK匹配的记录并检查一些其他语句。如果select语句返回0行,我想返回true,否则返回false。我已经编写了这段代码:

CREATE FUNCTION isAlreadyTaken(FK INT4, Date1 DATE, Date2 DATE)
  RETURNS BOOLEAN
AS $$
BEGIN
  CREATE TEMP TABLE helper ON COMMIT DROP AS SELECT COUNT(table.FK) AS quant 
    FROM table
    WHERE table.FK = FK AND table.Date2 IS NULL;
  SELECT CASE
    WHEN helper.quant > 0
    THEN FALSE
    ELSE TRUE 
  END;
END
$$ LANGUAGE plpgsql;

代码正在编译,可以执行。但是当我在CHECK语句中调用该函数时,它返回一个ERROR [42P01]。解决方案是否接近实际工作的解决方案,或者我完全迷失了方向?

1 个答案:

答案 0 :(得分:1)

COUNT(...) > 0 WHERE ...相当于EXISTS(select ... where ...),并且 EXISTS(table expression) 已经产生一个布尔值:

EXISTS (
 SELECT *
 FROM table t
 WHERE t.FK = FK AND t.Date2 IS NULL
 )

将它放入您的查询中(注意Date1和Date2参数似乎未使用...)

CREATE FUNCTION isAlreadyTaken1(FK INT4, Date1 DATE, Date2 DATE)
  RETURNS BOOLEAN
AS $$
BEGIN
  RETURN EXISTS (
    SELECT 1
    FROM table t
    WHERE t.FK = FK 
         AND t.Date2 IS NULL    -- <<-- this looks nonsensical
        );
END
$$ LANGUAGE plpgsql;

并且,正如@a_horse_with_no_name所评论的那样:你甚至不需要plpgsql,只需普通的SQL即可:

CREATE FUNCTION isAlreadyTaken1a(FK INT4, Date1 DATE, Date2 DATE)
  RETURNS BOOLEAN
AS $func$
  SELECT EXISTS (
    SELECT 1
    FROM table t
    WHERE t.FK = FK
         AND t.Date2 IS NULL    -- <<-- this looks nonsensical
        );
$func$ LANGUAGE sql;
BTW:我颠倒了逻辑。 IMO allreadyTaken 表示count() > 0