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 e xx 是数据库名称吗? 【参考方案1】:

e.id = id 始终为真。

在子查询中,您可以省略表限定内表,而不是外表。

建议使用EXISTS ( SELECT 1... ) 而不是( SELECT COUNT(*) ... ) &gt; 0 )

似乎正在执行两个“存在”检查的表达式。考虑为此使用JOIN

【讨论】:

以上是关于SQL 函数在某些情况下会出错,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

matlab中function函数怎么用,为啥出错

oracle sql TO_CHAR 函数在某些情况下添加尾随空白

为啥 SQL 中没有 PRODUCT 聚合函数?

在啥情况下会在控制权到达 main() 函数之前发生崩溃? [复制]

javascript 函数在函数所在的script标签下为啥不能被调用

为啥切片函数在不明确使用 dplyr 的情况下不起作用