gpt4 book ai didi

sql - 如何创建一个根据 select 语句结果返回 bool 值的函数

转载 作者:行者123 更新时间:2023-12-02 17:23:15 36 4
gpt4 key购买 nike

我有一个表(Id、FK、Date1、Date2),我需要创建一个函数来返回一个 bool 值。通常我想选择与给定 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 语句中调用该函数时,它返回一个错误 [42P01]。解决方案是接近实际工作的解决方案,还是我完全迷路了?

最佳答案

COUNT(...) > 0 WHERE ... 等同于 EXISTS(select ... where ...) ,并且EXISTS(table expression) 已经产生一个 bool 值:

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

关于sql - 如何创建一个根据 select 语句结果返回 bool 值的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41026544/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com