【问题标题】:MySql Stored Procedure and Comma Separated Varchar with In StatementMySql 存储过程和逗号分隔的 Varchar 与 In 语句
【发布时间】:2013-12-08 10:34:02
【问题描述】:

我正在尝试创建一个存储过程,它将以逗号分隔的列表作为值并将其推送到带有 IN 子句的 select 语句中。我知道 find_in_set 有效,但确实有性能开销。我也尝试过准备语句,但问题仍然存在。

我的例子:

我的参数是 sp1,包含值:'valuex, valuey, valuez'。

BEGIN

    set @sql = concat('select *  from tablename WHERE assignedTo in (', sp1, ')');

    PREPARE q FROM @sql;

    execute q;

END

正如预期的那样,这会引发错误,因为 SQL 会将值视为列名。我的问题是如何实现:'valuex','valuey','valuez' FROM 'valuex, valuey, valuez'?

【问题讨论】:

    标签: mysql stored-procedures


    【解决方案1】:

    你可以使用replace函数:

    BEGIN
    
        set @sql = concat("select *  from tablename WHERE assignedTo in ('", replace(sp1,",","','"), "')");
    
        PREPARE q FROM @sql;
    
        execute q;
    
    END
    

    【讨论】:

      【解决方案2】:

      一个选项是:

      DELIMITER $$
      
      DROP PROCEDURE IF EXISTS `sp_test`$$
      
      CREATE PROCEDURE `sp_test`(`sp1` VARCHAR(50))
      BEGIN
          SET `sp1` := REPLACE(REPLACE(`sp1`, ', ', ','), ',', '\',\'');
          SET @`query` := CONCAT('SELECT `column0`, `column1` FROM `tablename` WHERE `assignedTo` IN (\'', `sp1`, '\');');
          PREPARE `stmt` FROM @`query`;
          EXECUTE `stmt`;
          DEALLOCATE PREPARE `stmt`;
      END$$
      
      DELIMITER ;
      
      CALL `sp_test`('valuex, valuey, valuez');
      -- SELECT `column0`, `column1` FROM `tablename` WHERE `assignedTo` IN ('valuex','valuey','valuez');
      

      【讨论】:

      • 啊,简单让我有点恼火 - 我总是希望过于复杂 - 这是完美的谢谢!
      猜你喜欢
      • 1970-01-01
      • 2012-05-15
      • 2014-08-23
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 2023-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多