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 ;
到目前为止,我几乎得到了两种方法,但仍然对我不好:
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,这就是我想要的解决方案!