Как сделать несколько операторов LIKE И внутри хранимой процедуры? - PullRequest
1 голос
/ 20 марта 2020

Например, я получил массив:

carBrand: 'ford', 'volve', 'honda'

Я хотел бы найти поле, содержащее все его элементы, просто как:

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

И массив является входным параметром вне хранимой процедуры

Пока у меня есть почти два подхода, но они все еще не годятся для меня:

  1. используйте REGEXP

, например:

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

Но на самом деле код делает оператор OR, все, что я хочу, это оператор AND.

используйте полнотекстовый индекс

, например:

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

Это самое близкое решение, которое я нашел ,, но я действительно не хочу устанавливать полный текстовый указатель.

Есть ли другое решение? Спасибо всем!

1 Ответ

1 голос
/ 20 марта 2020

Эта хранимая процедура

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%';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...