如何根据数据库中的记录数返回布尔值



以下是我尝试过的。我的主机正在返回一个错误,";很抱歉发生了意外错误&"。

如果至少有一条记录的组合为pdriver_id、ptruck_number和pdate,我希望它返回true。

DELIMITER %%
CREATE FUNCTION DriverActiveInTruckByDate(
pdriver_id INT,
ptruck_number INT,
pdate DATETIME
) 
RETURNS boolean
DETERMINISTIC
BEGIN
DECLARE inDB INT DEFAULT 0;
SET inDB = 
SELECT IF(COUNT(*) >= 1,1,0)
FROM
truck_timeline tl
WHERE 1=1
AND tl.driver_id = pdriver_id
AND tl.truck_number = ptruck_number
AND ((pdate BETWEEN tl.begin_date AND tl.end_date) OR (pdate >= tl.begin_date AND tl.end_date IS NULL))

END
%%
DELIMITER ;

需要几个修复程序:

  • 函数不是DETERMINISTIC。这意味着在给定相同输入的情况下,结果将始终相同。在您的情况下,结果可能会有所不同,具体取决于truck_timeline表中的数据。所以我建议使用READS SQL DATA

  • 如果使用SET variable = SELECT...,则必须将SELECT放在子查询中:

    SET inDB = (SELECT ...);
    
  • 当前手册建议使用SELECT ... INTO variable而不是SET。看见https://dev.mysql.com/doc/refman/8.0/en/select-into.html

    MySQL 8.0.20支持语句末尾的INTO位置,它是首选位置。

    SELECT ... INTO inDB;
    
  • 您显示的函数没有RETURN语句。看见https://dev.mysql.com/doc/refman/8.0/en/return.html

    存储的函数中必须至少有一个RETURN语句。

您的完整代码可能是这样的:

DELIMITER %%
CREATE FUNCTION DriverActiveInTruckByDate(
pdriver_id INT,
ptruck_number INT,
pdate DATETIME
) 
RETURNS boolean
DETERMINISTIC
BEGIN
DECLARE inDB INT DEFAULT 0; 
SET inDB = 
(SELECT IF(COUNT(*) >= 1,1,0)
FROM
truck_timeline tl
WHERE 1=1
AND tl.driver_id = pdriver_id
AND tl.truck_number = ptruck_number
AND ((pdate BETWEEN tl.begin_date AND tl.end_date) OR (pdate >= tl.begin_date AND tl.end_date IS NULL))
);
END %%
DELIMITER ;

最新更新