gpt4 book ai didi

MYSQL存储过程字符串参数列表和using IN子句

转载 作者:行者123 更新时间:2023-11-30 00:13:07 26 4
gpt4 key购买 nike

我有这个存储过程查询。我在数据集中的 vb.net 中使用此代码,因此我需要在每个 where 子句中传递参数。或者我可以从 vb.net 传递此存储过程中的整个 where 子句吗?如果不是,我该如何执行“where IN 子句”,因为如果我调用我的存储过程,我会收到错误。

也许有人可以告诉我如何处理这个问题。

DELIMITER $$

DROP PROCEDURE IF EXISTS `lcs_rdb`.`sp_MissedCallsReport`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_MissedCallsReport`()
BEGIN
select
cdr_extension_no, cdr_charge_to, COUNT(cdr_call_type_code) as answered,
SUM(cdr_call_type_code = 'BSY') as Busy,
sum(cdr_call_type_code = 'ABN') as abandon,
sum(cdr_call_type_code in ('BSY','ABN')) as total,
coalesce((sum(case cdr_call_type_code when 'ABN' then cdr_duration_number/60000 else 0 end) / sum(cdr_call_type_code = 'ABN')),0) as avg_abandon,
coalesce((sum(cdr_call_type_code in ('BSY','ABN')) /
(sum(cdr_call_type_code in ('BSY','ABN')) + COUNT(cdr_call_type_code))) *100,0) as missed_calls_rate
from cdr_departments
where cdr_site_id = '{0}' AND
cdr_datetime BETWEEN '{1}' AND '{2}'
AND cdr_call_class_id IN({3}) AND cdr_call_type_id IN({4})
AND cdr_extension_id IN({5}) or cdr_route_member_id IN ({6})
GROUP BY cdr_extension_no;
END$$

DELIMITER ;

最佳答案

我建议您在存储过程中使用 IN 参数,以便与 WHERE 子句一起使用。

示例:

PROCEDURE `sp_MissedCallsReport`(
IN param_cdr_site_id INT
, IN param_cdr_datetime_min DATETIME
, IN param_cdr_datetime_max DATETIME
, IN param_cdr_call_class_id_csv VARCHAR(1024) -- csv integers
, IN param_cdr_call_type_id_csv VARCHAR(1024) -- csv integers
, IN param_cdr_extension_id_csv VARCHAR(1024) -- csv integers
, IN param_cdr_route_member_id_csv VARCHAR(1024) -- csv integers
)

我建议将 int 值的 CSV 形式作为参数占位符编号 3、4、5 和 6 的 varchar 参数。这是因为,您想将它们与IN 作为一组在其中进行搜索。由于我们无法将值数组作为过程参数传递,因此我们可以使用 CSV 表单作为替代方案。由于输入为 CSV 格式,IN 不适合用于搜索。
我们可以将 FIND_IN_SET 与 CSV 值结合使用。

示例:(对于您的 where 子句):

where cdr_site_id = param_cdr_site_id
AND cdr_datetime BETWEEN param_cdr_datetime_min AND param_cdr_datetime_max
AND FIND_IN_SET( cdr_call_class_id, param_cdr_call_class_id_csv )
AND FIND_IN_SET( cdr_call_type_id, param_cdr_call_type_id_csv )
AND ( FIND_IN_SET( cdr_extension_id, param_cdr_extension_id_csv )
or FIND_IN_SET ( cdr_route_member_id, param_cdr_route_member_id_csv ) )

引用:

关于MYSQL存储过程字符串参数列表和using IN子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23881415/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com