如何创建一个 return 布尔值取决于 select 语句结果的函数
How to create a function which return a boolean depending on a select statement result
我有一个 table(Id, FK, Date1, Date2),我需要创建一个函数来 return 一个布尔值。通常我想 select 记录匹配给定的 FK 并检查一些额外的语句。如果 select 语句 returns 0 行,我想 return 为真,否则为假。我已经写了这段代码:
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 语句中调用该函数时,它 return 是一个错误 [42P01]。解决方案是接近实际工作的解决方案,还是我完全迷路了?
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;
顺便说一句:我颠倒了逻辑。 IMO allreadyTaken 表示 count() > 0
.
我有一个 table(Id, FK, Date1, Date2),我需要创建一个函数来 return 一个布尔值。通常我想 select 记录匹配给定的 FK 并检查一些额外的语句。如果 select 语句 returns 0 行,我想 return 为真,否则为假。我已经写了这段代码:
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 语句中调用该函数时,它 return 是一个错误 [42P01]。解决方案是接近实际工作的解决方案,还是我完全迷路了?
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;
顺便说一句:我颠倒了逻辑。 IMO allreadyTaken 表示 count() > 0
.