【问题标题】:MySql Prepare sql statement for search filterMySql为搜索过滤器准备sql语句
【发布时间】:2014-09-07 23:27:58
【问题描述】:

我有一个 Sql SP,它根据传递给 SP 的参数应用过滤器。 如果我只在下面的示例中传递有效值,例如 (2,4),它就可以工作。 但如果没有通过过滤器,它应该返回所有行。 问题正在检查 parmIndustryId 为 null 或 parmIndustryId 为 '' 空字符串,否则它可以工作,但我需要能够检查空字符串或 null。

这是我得到的错误
错误代码:1241。操作数应包含 1 列 0.000 秒

CREATE  PROCEDURE `SearchIndustry`(
         IN  parmIndustryId TEXT     
    )
BEGIN
 SET parmIndustryId ='2,4';

 set @sql = CONCAT(' Select t1.*  
  FROM  Industry t1 
  WHERE Active =1 AND(', parmIndustryId ,' is null OR t2.IndustryId IN( ', parmIndustryId, ' ))')

    ;

PREPARE q FROM @sql;
execute q;

END$$
DELIMITER ;

如何正确传递 IN 操作数过滤器的值?

【问题讨论】:

    标签: mysql sql stored-procedures prepared-statement


    【解决方案1】:

    你可以使用FIND_IN_SET():

    SELECT *
    FROM Industry
    WHERE Active = 1 
      AND (parmIndustryId IS NULL OR FIND_IN_SET(IndustryId, parmIndustryId))
    

    编辑,如果可以传递空字符串,您可能还需要使用COALESCE。如果是这样,这将起作用:

     SELECT *
     FROM Industry
     WHERE Active = 1 
        AND (COALESCE($parmIndustryId,'') = '' 
                 OR FIND_IN_SET(IndustryId, $parmIndustryId));
    

    【讨论】:

    • 但不会使用任何索引
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 2011-09-16
    相关资源
    最近更新 更多