【问题标题】:how to make multiple LIKE AND statements inside stored procedured?如何在存储过程中创建多个 LIKE AND 语句?
【发布时间】:2020-03-20 08:12:21
【问题描述】:

例如,我有一个数组:

汽车品牌:“福特”、“沃尔夫”、“本田”

我想搜索一个包含所有元素的字段,就像:

SELECT * FROM car_company WHERE car_company.brandStory LIKE '%ford%' AND car_company.brandStory LIKE '%volve%' 
AND car_company.brandStory LIKE '%honda%';

并且数组是存储过程之外的输入参数

到目前为止,我几乎得到了两种方法,但对我来说仍然不好:

  1. 使用正则表达式

例如:

SET carBrand = 'ford|volve|honda'; //input parameter
SELECT * FROM car_company WHERE car_company.brandStory REGEXP carBrand;

但代码实际上是 OR 语句,我想要的只是 AND 语句。

  1. 使用全文索引

例如:

SET carBrand = '+ford +volve +honda';  //input parameter
SELECT * FROM car_company WHERE MATCH (brandStory) AGAINST (carBrand IN BOOLEAN MODE);

这是我找到的最接近的解决方案,但我真的不想设置全文索引。

还有其他解决方案吗?谢谢大家!

【问题讨论】:

    标签: mysql stored-procedures


    【解决方案1】:

    这个存储过程

    USE `testdb`;
    DROP procedure IF EXISTS `BuildSelect`;
    
    DELIMITER $$
    USE `testdb`$$
    CREATE DEFINER=`root`@`localhost` PROCEDURE `BuildSelect`(IN carbrand TEXT)
    BEGIN
    
        DECLARE brand TEXT DEFAULT NULL;
        DECLARE brandlength INT DEFAULT 0;
        DECLARE Tempbrand TEXT DEFAULT NULL;
    
    
    
        SET @Selectstr = "SELECT * FROM car_company WHERE";
        iterator:
        LOOP
            IF LENGTH(TRIM(carbrand)) = 0 OR carbrand IS NULL THEN
                LEAVE iterator;
            END IF;
            SET brand = SUBSTRING_INDEX(carbrand,',',1);
            SET Tempbrand = CONCAT(" car_company.brandStory LIKE '%",TRIM(brand),"%'");
            IF brandlength > 0 THEN
                SET Tempbrand = CONCAT(" AND",Tempbrand);
            END IF;
            SET @Selectstr = CONCAT(@Selectstr,COALESCE(Tempbrand,''));
            SET carbrand = SUBSTRING_INDEX(carbrand,',',-(LENGTH(carbrand) - LENGTH(REPLACE(carbrand, ',', '')) ));
            SET brandlength = brandlength +1;
        END LOOP iterator;
        SET @Selectstr = CONCAT(@Selectstr ,";");
        PREPARE  id  FROM @Selectstr;
        EXECUTE id;
        DEALLOCATE PREPARE id;
        #SELECT @Selectstr;
    END$$
    
    DELIMITER ;
    

    将与此调用一起运行

     call BuildSelect('Ford,Audi,Mercedes');
    

    运行此查询

    SELECT * FROM car_company 
    WHERE car_company.brandStory LIKE '%Ford%' 
          AND car_company.brandStory LIKE '%Audi%' 
          AND car_company.brandStory LIKE '%Mercedes%';
    

    【讨论】:

    • 谢谢nbk,这就是我想要的解决方案!
    猜你喜欢
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多