【问题标题】:How to Pass a List of String in MySQL Stored Procedure?如何在 MySQL 存储过程中传递字符串列表?
【发布时间】:2013-04-12 18:06:44
【问题描述】:

我试图在 MySQL 存储过程中将数组作为字符串传递,但它不能正常工作。

这是我的 SQL 代码:

CREATE DEFINER=`root`@`localhost` PROCEDURE `search_equipment`(IN equip VARCHAR(100), IN category VARCHAR(255))
BEGIN
    SELECT *
        FROM Equipment
        WHERE e_description
        LIKE CONCAT("%",equip,"%")
            AND e_type IN (category)
END

这就是我如何调用该过程:

String type = "'I.T. Equipment','Office Supply'";

CALL search_equipment('some equipment', type);

有什么想法吗?

【问题讨论】:

    标签: java mysql sql


    【解决方案1】:

    我希望你的朋友是 FIND_IN_SET。我在这个问题中第一次遇到这种方法:也涵盖在这个问题中MYSQL - Stored Procedure Utilising Comma Separated String As Variable Input

    FIND_IN_SET 的 MySQL 文档在这里 http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set

    所以你的程序会变成

    CREATE DEFINER=`root`@`localhost` 
    PROCEDURE `search_equipment`(
        IN equip VARCHAR(100), 
        IN category VARCHAR(255)
    )
    BEGIN
        SELECT *
        FROM Equipment
        WHERE e_description LIKE CONCAT("%",equip,"%")
        AND FIND_IN_SET(e_type,category)
    END
    

    这依赖于类别字符串是逗号分隔的列表,因此您的调用代码变为

    String type = "I.T. Equipment,Office Supply";
    
    CALL search_equipment('some equipment', type);
    

    (p.s. 修正了一个错字,在你的论点中你输入了 categoy)

    【讨论】:

    • 不仅FIND_IN_SET是我的朋友,今天你也是我的朋友。
    【解决方案2】:

    你必须创建一个动态语句:

    DELIMITER $$
    CREATE DEFINER=`root`@`localhost` PROCEDURE `search_equipment`(IN equip VARCHAR(100), IN category VARCHAR(255))
    BEGIN
        SET @s = 
            CONCAT('SELECT *
                FROM Equipment
                WHERE e_description
                LIKE \'%',equip,'%\'
                AND e_type IN (',category,')');
        PREPARE stmt from @s;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt3;
    END$$
    

    【讨论】:

    • mso.net 的Simon 的解决方案比我的要容易,尽管可能没有那么快。如果您的表不是很大(读取数百万行),则 FIND_IN_SET 解决方案更好。
    【解决方案3】:

    这有助于我做 IN 条件 希望这会对你有所帮助..

    CREATE  PROCEDURE `test`(IN Array_String VARCHAR(100))
    BEGIN
        SELECT * FROM Table_Name
        WHERE FIND_IN_SET(field_name_to_search, Array_String);
    
    END//;
    

    调用:

    call test('3,2,1');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      相关资源
      最近更新 更多