如何将变量传递给 IN 子句?

Posted

技术标签:

【中文标题】如何将变量传递给 IN 子句?【英文标题】:How to pass a variable to a IN clause? 【发布时间】:2012-10-18 10:30:22 【问题描述】:

假设我有一个具有SELECT 语句的 SP,如下所示,

SELECT product_id, product_price FROM product 
WHERE product_type IN ('AA','BB','CC');

但是到IN 子句的数据必须通过包含值字符串的单个变量。下面的东西链接

SELECT product_id, product_price FROM product 
WHERE product_type IN (input_variables);

但它不是那样工作的。知道怎么做吗?

【问题讨论】:

input_variables 来自哪里? php? 它实际上是从 cron 作业直接执行 mysql,因此它是 SP 的输入参数之一。用户输入它们取决于他们想要什么数据。 所以你的意思是它是单个变量中的逗号分隔值? 应该是。但我可以按照我想要的方式进行(如果我找到正确的方法:)),但这将是用户输入。 你不能。单个变量,即使它是逗号分隔值,也会被解释为单个值。例如,您有变量x = '1','2','3','4'。当您像这样将其传递给in WHERE y IN (x) 时,它将被解释为WHERE y IN ('1,2,3,4') 而不是WHERE y IN ('1','2','3','4') 【参考方案1】:

像这样传递参数值 - 'AA,BB,CC'。那么,使用FIND_IN_SET函数就够了-

SELECT product_id, product_price
FROM product
WHERE FIND_IN_SET(product_type, param);

【讨论】:

这将导致查询在所有没有索引的表上运行。即使认为这是一个有效的答案也不可靠【参考方案2】:

创建一个用户定义的函数,将逗号分隔的值转换为表格,并将这两者连接起来可以得到想要的结果。

for more

【讨论】:

【参考方案3】:

使用变量传递字符串是一个问题,假设这个解决方案

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `spTestListValues`(_list varchar(200))
BEGIN
        SET @LIST=_list; -- assume this a paramter from the stored procedure
    SELECT NULL AS Id,  '' AS Description --insert null value to be used for list box population
    UNION  
    (SELECT id, Description
    FROM test_table
    WHERE FIND_IN_SET(id,@LIST) ORDER BY Description ASC) ;

END

从其他查询窗口调用过程

call `spTestListValues`('4,5,3'); --no paramter currently for test

输出

ID Description
NUll 
1   TEST1 
4   TEST2
5   TEST3

【讨论】:

【参考方案4】:

尝试使用准备好的语句:https://dev.mysql.com/doc/refman/8.0/en/sql-prepared-statements.html

【讨论】:

以上是关于如何将变量传递给 IN 子句?的主要内容,如果未能解决你的问题,请参考以下文章

如何在IN子句中传递变量

如何将字符串变量传递给动态sql中的where子句

HANA - 将字符串变量传递到 SQL 脚本中的 WHERE IN() 子句

使用 codeigniter 将变量传递给 SELECT 子句

如何将数组传递给 IN() 子句? [复制]

如何将字符串数组动态传递给Java中的SQL“IN”子句? [复制]