【问题标题】:How to use string in IN clause in stored procedure mysql如何在存储过程mysql的IN子句中使用字符串
【发布时间】:2016-04-18 12:27:22
【问题描述】:

在我的代码中,我将一个字符串变量 ('4,5,6') 传递给我的存储过程,该过程从这个字符串 (4,5,6-Name) 分解而来。我在存储过程中使用 IN 子句,我知道 IN 子句接受 ('4','5','6') 或只是 (4,5,6) 这种类型的数据,但我无法在我的存储过程。如果有任何其他方法可以实现它,请帮助我。

CREATE DEFINER = 'root'@'localhost'
PROCEDURE kbm.report_site_transfer(IN siteid VARCHAR(50), IN datefrom VARCHAR (15), IN dateto VARCHAR (15))

SELECT
        * 
      FROM
        tbl_transfer
      WHERE
        tbl_transfer.siteNameID IN (siteid) AND (tbl_transfer.paymentDate BETWEEN datefrom AND dateto);

【问题讨论】:

  • site_id的值是多少
  • @Uchiha 实际上我正在分解一个字符串 (4,5,6-anyname) 并用“-”分隔符分解它,并希望在 IN 子句 (4,5,6) 中使用第一个值但是当我检查 php 中的类型时,它显示一个字符串,所以我无法在存储过程的 IN 子句中使用
  • 查看动态创建和执行查询字符串stackoverflow.com/questions/8549619/…。您需要在传递的参数中添加周围的单引号。
  • @PaulF 我已经检查过了,但对我不起作用
  • 你能显示你用来创建字符串的代码吗?

标签: php mysql stored-procedures


【解决方案1】:

这段代码也可以正常工作。我使用了 FIND_IN_SET 函数:

FIND_IN_SET(tbl_transfer.siteNameID, siteid)

完整代码:

CREATE DEFINER = 'root'@'localhost'
PROCEDURE kbm.report_site_transfer(IN siteid VARCHAR(50), IN datefrom VARCHAR (15), IN dateto VARCHAR (15))

SELECT
    * 
  FROM
    tbl_transfer
  WHERE
FIND_IN_SET(tbl_transfer.siteNameID, siteid)  AND (tbl_transfer.paymentDate BETWEEN datefrom AND dateto);

【讨论】:

    【解决方案2】:

    你有没有尝试过像我给你的链接一样的东西 - 你将整个查询创建为一个字符串,然后作为一个准备好的语句执行:

    CREATE DEFINER = 'root'@'localhost'
    PROCEDURE kbm.report_site_transfer(IN siteid VARCHAR(50), IN datefrom VARCHAR (15), IN dateto VARCHAR (15))
    
    Set @query = CONCAT("SELECT * FROM tbl_transfer WHERE tbl_transfer.siteNameID IN (", siteid, ") AND (tbl_transfer.paymentDate BETWEEN ", datefrom, " AND ", dateto, ")";
    
    PREPARE stmt FROM @query;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

    如果你想要单引号版本,你可以使用这个:

    Set @query = CONCAT("SELECT * FROM tbl_transfer WHERE tbl_transfer.siteNameID IN ('", REPLACE(siteid,",", "','"), "') AND (tbl_transfer.paymentDate BETWEEN ", datefrom, " AND ", dateto, ")";
    

    【讨论】:

    • 感谢 PaulF,查询运行完美,但我也找到了一种方法,它也可以提供我想要的输出。但非常感谢你的努力
    猜你喜欢
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    相关资源
    最近更新 更多