SQL 函数在某些情况下会出错,为啥?
Posted
技术标签:
【中文标题】SQL 函数在某些情况下会出错,为啥?【英文标题】:SQL function gives error in some cases, why?SQL 函数在某些情况下会出错,为什么? 【发布时间】:2020-01-13 11:56:41 【问题描述】:我有以下函数,在我们生成数据时为每一行运行。如果我在单独的条目上运行该函数,它可以工作,但在编译过程中会出错,所以肯定有一些行会破坏它,但我看不出它可能是什么......语法有什么问题吗?我不是在想这里吗?非常感谢任何帮助或提示
DROP FUNCTION IF EXISTS xx__calc_date;;
CREATE FUNCTION xx_calc_date(date INT, id INT, esId INT)
RETURNS DATE
DETERMINISTIC
BEGIN
IF date IS NULL OR date = 0 THEN
RETURN NULL;
ELSE -- this is where the error lies
IF(SELECT COUNT(b.TimeSort) FROM Booking b
WHERE b.BookingId IN (SELECT DISTINCT e.BookingId
FROM xx.Events e
WHERE e.id = id AND e.esId = esId)
AND TimeSort < 86400) > 0
THEN
RETURN STR_TO_DATE(date, '%Y%m%d');
ELSE
RETURN DATE_ADD(date, INTERVAL 1 DAY);
END IF;
END IF;
END;;
【问题讨论】:
您使用的是哪个DBMS 产品? “SQL”只是一种查询语言,而不是特定数据库产品的名称,并且存储的函数/过程是高度特定于供应商的。请为您正在使用的数据库产品添加tag。 Why should I tag my DBMS 如果遇到错误,为什么不分享错误信息? 能否请您向我们展示一下 Booking 表和 Events 表的架构。另外,您能否告诉我们错误消息是什么 - 以帮助我们帮助您? DBMS 是 MariaDB。生成脚本提供的唯一错误是“xx_fact_trip SQLEXCEPTION”和时间戳,因此不太容易理解或调试问题:/ 生成脚本提供的唯一错误是“xx_fact_trip SQLEXCEPTION”和时间戳您在执行期间是否收到此错误。不是在创作期间? 这不是很容易理解或调试问题 创建调试表并将有关流程步骤的信息插入其中。 "xx_fact_trip SQLEXCEPTION" 当前的 SQL 模式是什么? FROM xx.Events exx
是数据库名称吗?
【参考方案1】:
e.id = id
始终为真。
在子查询中,您可以省略表限定内表,而不是外表。
建议使用EXISTS ( SELECT 1... )
而不是( SELECT COUNT(*) ... ) > 0 )
似乎正在执行两个“存在”检查的表达式。考虑为此使用JOIN
。
【讨论】:
以上是关于SQL 函数在某些情况下会出错,为啥?的主要内容,如果未能解决你的问题,请参考以下文章
oracle sql TO_CHAR 函数在某些情况下添加尾随空白
在啥情况下会在控制权到达 main() 函数之前发生崩溃? [复制]