Mysql 如何在存储过程中生成多个LIKE和语句?

Mysql 如何在存储过程中生成多个LIKE和语句?,mysql,stored-procedures,Mysql,Stored Procedures,例如,我得到了一个数组: 卡布兰德:“福特”,“沃夫”,“本田” 我想搜索一个包含所有元素的字段,就像: SELECT * FROM car_company WHERE car_company.brandStory LIKE '%ford%' AND car_company.brandStory LIKE '%volve%' AND car_company.brandStory LIKE '%honda%'; 数组是存储过程外部的输入参数 USE `testdb`; DROP procedu

例如,我得到了一个数组:

卡布兰德:“福特”,“沃夫”,“本田”

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

SELECT * FROM car_company WHERE car_company.brandStory LIKE '%ford%' AND car_company.brandStory LIKE '%volve%' 
AND car_company.brandStory LIKE '%honda%';
数组是存储过程外部的输入参数

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 ;
到目前为止,我几乎得到了两种方法,但仍然对我不好:

  • 使用REGEXP
  • 例如:

    SET carBrand = 'ford|volve|honda'; //input parameter
    SELECT * FROM car_company WHERE car_company.brandStory REGEXP carBrand;
    
    SET carBrand = '+ford +volve +honda';  //input parameter
    SELECT * FROM car_company WHERE MATCH (brandStory) AGAINST (carBrand IN BOOLEAN MODE);
    
    但是代码生成OR语句实际上,我只需要AND语句

  • 使用全文索引
  • 例如:

    SET carBrand = 'ford|volve|honda'; //input parameter
    SELECT * FROM car_company WHERE car_company.brandStory REGEXP carBrand;
    
    SET carBrand = '+ford +volve +honda';  //input parameter
    SELECT * FROM car_company WHERE MATCH (brandStory) AGAINST (carBrand IN BOOLEAN MODE);
    
    这是我找到的最接近的解决方案,但我真的不想设置全文索引

    还有其他解决办法吗?谢谢大家

    此存储过程

    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,这就是我想要的解决方案!