Mysql

MySQL LIKE IN 與儲存過程逗號分隔值的輸入參數

  • February 15, 2020

我正在創建一個儲存過程來搜尋使用者的城鎮。從使用者界面中,使用者將選擇將發送到儲存過程的多個城鎮。儲存過程的 towns 參數的範例輸入如下orangi,faisal,nazimabad

儲存在表中的城鎮是

  • 橘子
  • 科朗吉
  • 沙阿費薩爾
  • 沙赫拉-費薩爾
  • 納西馬巴德
  • 北納西馬巴德

現在我想根據該輸入選擇所有上述記錄。那就是我想從儲存過程的參數中使用LIKE運算符。IN

我不知道輸入中有多少個城鎮。它可能只是一個,或兩個或三個或所有上面提到的。

我想根據該查詢搜尋所有城鎮

範例儲存過程是

CREATE PROCEDURE `GetUsersByTown`(
IN `SearchTowns` VARCHAR(200) -- `ORANGI,FAISAL,NAZIMABAD`
)
BEGIN
     SELECT
     name,
     Town,
     FROM userLocation where Town in (SearchTowns)
END

預期結果

  • 名稱—城鎮
  • 哈姆扎——橙子
  • 賈馬爾——科朗吉
  • 哈沙姆——沙阿費薩爾
  • Aliyan — Shahrah-e-Faisal
  • 丹麥語—Nazimabad
  • 法魯克——北納西馬巴德

我試過使用find_in_set(),但 FIND_IN_SET 不接受萬用字元%,它​​不使用索引?

我也看過 usingREGEXP ValueA|ValueB但我不知道如何將逗號分隔值的輸入參數放入該 REGEXP

  • 用於REPLACE(SearchTowns, ',', '|')將逗號更改為管道。
  • 把那個結果放進去,比如說,@regexp
  • 構造,通過CONCAT單個SELECTwith
SET @sql = CONCAT('SELECT
 name,
 Town,
 FROM userLocation where Town REGEXP "', @regexp, '"');
  • PREPAREEXECUTE查詢。

該查詢應如下所示:

SELECT
     name,
     Town,
     FROM userLocation where Town REGEXP "orangi|faisal|nazimabad"

(您可以手動執行它以驗證是否傳遞了正確的行。)

另外,一定要有 case-folding COLLATION,比如utf8mb4_unicode_520_cifor Town。(這由尾隨的 . 表示_ci。)

程式碼

DELIMITER //
CREATE PROCEDURE `GetUsersByTown`(
   IN `SearchTowns` VARCHAR(200) -- `ORANGI,FAISAL,NAZIMABAD`
)
BEGIN
IF (SearchTowns IS NULL) THEN
   SELECT name, Town
       FROM userLocation;
ELSE
   SET @towns = REPLACE(SearchTowns, ',', '|');
   SELECT name, Town
       FROM userLocation
       WHERE Town REGEXP (@towns);
END IF;
END //
DELIMITER ;

引用自:https://dba.stackexchange.com/questions/259231