简体   繁体   English

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

[英]MYSQL Stored Procedure list of string parameter and using IN clause

I have this stored procedure query. 我有此存储过程查询。 I'm using this code in my vb.net in dataset so i need is to pass parameter in my every where clause. 我在数据集中的vb.net中使用此代码,因此我需要在每个where子句中传递参数。 or can i pass my whole where clause in this stored procedure from my vb.net.If not how can i do the "where IN clause" because im getting error if I'm call my stored procedure. 或者我可以通过我的vb.net在此存储过程中传递我的整个where子句。

Maybe someone can give me some idea how can i handle this problem. 也许有人可以给我一些想法,我该如何处理这个问题。

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 ;

I suggest you use IN parameters for your stored procedure to use with WHERE clause. 我建议您为存储过程使用IN参数,以与WHERE子句一起使用。

Example : 范例

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
)

I suggest CSV form of int valuess as varchar params for parameter placeholder numbers 3,4,5, and 6. It is because, you want to use them with IN as a set to search in them. 我建议将int值的CSV形式用作参数占位符编号3、4、5和6的varchar参数。这是因为,您想将它们与IN一起使用来搜索它们。 As we can't pass an array of values as procedure parameters, we can make use of CSV form as an alternative. 由于我们不能将值数组作为过程参数传递,因此可以使用CSV格式作为替代。 And as the input is in CSV format, the IN is not suitable to use for search. 并且由于输入为CSV格式,因此IN不适合用于搜索。
We can use FIND_IN_SET with CSV values. 我们可以将FIND_IN_SET与CSV值一起使用。

Example : (for your where clause): 示例 :(针对您的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 ) )

Refer to : 参考

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM