Mysql
MySQL LIKE IN 與儲存過程逗號分隔值的輸入參數
我正在創建一個儲存過程來搜尋使用者的城鎮。從使用者界面中,使用者將選擇將發送到儲存過程的多個城鎮。儲存過程的 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 不接受萬用字元%
,它不使用索引?我也看過 using
REGEXP ValueA|ValueB
但我不知道如何將逗號分隔值的輸入參數放入該 REGEXP
- 用於
REPLACE(SearchTowns, ',', '|')
將逗號更改為管道。- 把那個結果放進去,比如說,
@regexp
。- 構造,通過
CONCAT
單個SELECT
withSET @sql = CONCAT('SELECT name, Town, FROM userLocation where Town REGEXP "', @regexp, '"');
PREPARE
和EXECUTE
查詢。該查詢應如下所示:
SELECT name, Town, FROM userLocation where Town REGEXP "orangi|faisal|nazimabad"
(您可以手動執行它以驗證是否傳遞了正確的行。)
另外,一定要有 case-folding
COLLATION
,比如utf8mb4_unicode_520_ci
forTown
。(這由尾隨的 . 表示_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 ;