【问题标题】:How to pass a variable to a IN clause?如何将变量传递给 IN 子句?
【发布时间】: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')

标签: mysql variables stored-procedures in-clause


【解决方案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】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-28
        • 1970-01-01
        • 2017-05-11
        • 2016-01-12
        • 1970-01-01
        • 2020-04-23
        • 2019-07-10
        • 2014-07-06
        相关资源
        最近更新 更多