如何使用 IN 参数设置存储过程,以便它将空 ('') 视为选择所有值的命令

how to set Stored procedure with IN parameter so that it sees empty ('') as command to select all values

提问人:Him 提问时间:10/31/2023 最后编辑:Him 更新时间:10/31/2023 访问量:39

问:

我有一个代码

CREATE DEFINER=`root`@`localhost` PROCEDURE `find_stock_order`(
    in_product_name varchar(45),
    in_date DATE)
BEGIN
    SELECT * from stock_order_view
    where product_name=in_product_name and DateTime_order=in_date;
END

当我为这 2 个参数中的每一个写入值时,它就会起作用。但是,当我想仅按product_name而不是按订单日期查找所有订单时,它不起作用。我没有向参数in_date写任何东西(希望它会将其视为选择任何日期),但它显示错误。

我有桌子

product_name DateTime_order
可乐 2022-01-01
汉堡 2022-12-10
汉堡 2022-06-10

我的参数:

  1. in_product_name - 汉堡
  2. in_date - (我什么都不写,所以它会自动看到“”)

因此,我想看到:

product_name DateTime_order
汉堡 2022-12-10
汉堡 2022-06-10

但它显示一个错误,因为我需要输入参数中任何 DATE 格式的内容

mysql 日期时间 存储过程

评论

1赞 Akina 10/31/2023
用。如果不想使用按列筛选的值,请提供 NULL 作为值。WHERE (column = in_value OR in_value IS NULL)
0赞 Him 10/31/2023
这是行不通的。作为结果,我想获取所有选定的产品,因此它不会在日期(包括 NULL)上设置过滤器
1赞 Bill Karwin 10/31/2023
听起来您认为空字符串 () 和 NULL 是相同的值。事实并非如此。''

答:

1赞 SelVazi 10/31/2023 #1

用于可选列,如@akina在评论中建议的那样:WHERE (column = in_value OR in_value IS NULL)

CREATE DEFINER=`root`@`localhost` PROCEDURE `find_stock_order`(
    in_product_name varchar(45),
    in_date DATE)
BEGIN
    SELECT * from stock_order_view
    where product_name=in_product_name and (DateTime_order = in_date OR in_date IS NULL);
END

如果您不想按DateTime_order过滤:

call find_stock_order('Burger', NULL);

结果:

product_name|DateTime_order|
------------+--------------+
Burger      |    2022-12-10|
Burger      |    2022-06-10|

评论

0赞 Him 11/2/2023
如果我(例如)没有在“调用 find_stock_order('Burger', NULL);”中写入 NULL 的选项,我应该如何更改您的代码?我只能选择在出现的窗口中编写一些参数,这些参数将自动转换为调用find_stock_order('Burger', NULL)