mysql - 将记录传递给 MySQL 8 中的函数
问题描述
是否可以将整个记录作为参数传递给函数,类似于MySQL 8 中的 Postgres ?如果没有,是否有任何替代方案?
具体用例如下:
- 定义要在多个查询中重用的自定义(记录->布尔)过滤器
- 定义自定义映射(记录 -> JSON)
对于第一个用例(自定义过滤器),示例将转换表格的一行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)。
解决方案
您不能将行传递给例程(函数/过程)。您可以在调用例程之前使用临时表并将数据放入其中。只要您在同一会话中声明临时表,它就会在例程中可见。
如果您更详细地描述用例,则更容易给出更详细的答案。
这是一个基于您的示例数据的问题:
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;
推荐阅读
- gitlab - 我有一个 GitLab 自托管运行,但前端如何工作?
- python - 如何使用“conda list”输出 txt 安装 conda 包
- symfony4 - 如果在 Symfony 4 中被后台进程调用,Twig 在服务中渲染找不到 CSS
- javascript - 方法 zoomToMapObject(ev.target) 不会在 amCharts 中缩放到美国
- android - android上freetype2生成的位图,文字会重复,怎么解决
- python - 如何使用numpy在零之间形成一个交叉模式
- sql - 连接列并添加数字 postgresql
- r - R:如何在每个格子 xyplot 中设置两个标题(主标题和副标题)?
- python - 如何在熊猫数据框中获取最小值后的所有记录
- python - np.arange 还是 np.arage ?错误:使用 plot_confusion_matrix 时模块“numpy”没有属性“arage”