首页 > 解决方案 > 将记录传递给 MySQL 8 中的函数

问题描述

是否可以将整个记录作为参数传递给函数,类似于MySQL 8 中的 Postgres ?如果没有,是否有任何替代方案?

具体用例如下:


对于第一个用例(自定义过滤器),示例将转换表格的一行appointment

id, user_id, begins_at, ends_at, is_something, cancelled_at

成这个表达式:

(
    is_something && (cancelled_at IS NULL && @someDate > begins_at && @someDate < ends_at)
        || !is_something && (@someDate > ends_at)
)

这样我就可以重用这个表达式。


对于第二个用例,同样的想法是appointment将其转换为具有子查询和嵌套对象的特定 JSON 形状(MySQL 8)。

标签: mysqlmysql-8.0

解决方案


您不能将行传递给例程(函数/过程)。您可以在调用例程之前使用临时表并将数据放入其中。只要您在同一会话中声明临时表,它就会在例程中可见。

如果您更详细地描述用例,则更容易给出更详细的答案。

这是一个基于您的示例数据的问题:

create function f_do_something(
in_is_something int, 
in_cancelled_at datetime,
in_some_date date,
in_begins_at datetime, 
in_ends_at datetime
)
returns int
begin

return (
  (in_is_something!=0 and 
   in_cancelled_at is null and 
   in_some_date>in_begins_at and
   in_some_date<in_ends_at)
  or (
   in_is_something=0 and
   in_some_date>in_ends_at
  )
);

end;

然后,您可以在代码中使用该函数

select *
from your data
where f_do_something(is_something, cancelled_at, '2019-12-17', begins_at, ends_at) > 0;

推荐阅读