如何在MYSQL存储过程中的字符串动态列表中搜索字符串
Posted
技术标签:
【中文标题】如何在MYSQL存储过程中的字符串动态列表中搜索字符串【英文标题】:How to search a string within a dynamic list of string in MYSQL Stored Procedure 【发布时间】:2021-06-30 18:14:09 【问题描述】:在我的数据库中,我正在搜索这样的 ID 列表:
SELECT * from testcase where id in ('658', '659');
但是我怎样才能把它变成一个存储过程,它可以有多个 id 呢?
在这个例子中,我只有'658', '659'
,但这可能更多/更少。
我做了一个存储过程,但要么失败,因为我有两个或更多的 id,如果我把它变成像这样的单个字符串,'658, 659'
,那么它只能从 658
找到结果:
CREATE DEFINER=`edmetrics`@`%` PROCEDURE `GetCaseFromStrList`(CaseIDs varchar(300))
BEGIN
IF CaseIDs != 0 OR CaseIDs IS NOT NULL THEN
Select testcase.id, testcase.TestCaseName
From testcase
Where testcase.id in (CaseIDs);
END IF;
END
有没有办法用多个 X 数量的 id 拨打这样的电话?
CALL database.GetCaseFromStrList(658 , 659);
编辑 - 更多信息
被告知我冷看这个解决方案,但它不是 100% 我正在寻找的东西:*** Link
但我会用图片展示一个例子
当我编写这个 SQL 时:SELECT * from testcase where id in ('658', '659');
我得到以下结果
Table result
如果我尝试在我的存储过程中使用FIND_IN_SET()
实现链接解决方案,我有这个:
CREATE DEFINER=`edmetrics`@`%` PROCEDURE `GetCaseFromStrList`(CaseIDs varchar(300))
BEGIN
SET @idCaseIDs = CaseIDs;
IF CaseIDs != 0 OR CaseIDs IS NOT NULL THEN
Select testcase.id, testcase.TestCaseName
From testcase
WHERE FIND_IN_SET(testcase.id, @idCaseIDs);
END IF;
END
但是,如果我使用包含所有 ID 的字符串,并进行如下调用:
CALL testreporting.GetCaseFromStrList('658, 659');
我得到以下结果
Table result from stored procedure
在那个结果中,我错过了 ID 659
。
记住这是有两个 ID,但我可以有 X 个 ID,而不仅仅是两个。
【问题讨论】:
这能回答你的问题吗? mysql variable format for a "NOT IN" list of values @AndrewMorton 不是,我会发布图片以更好地理解我的问题 尝试:WHERE FIND_IN_SET(testcase.id, CaseIDs) 或查看***.com/questions/8149545/… @BerndBuffen 阅读编辑.. 【参考方案1】:fIND_IN_SET 工作正常,见示例
CREATE TABLE testcase(id int,TestCaseName varchar(50) )
INSERT INTO testcase VALUES (658,'test1'),(659,'test2')
CREATE PROCEDURE `GetCaseFromStrList`(_CaseIDs varchar(300)) BEGIN IF _CaseIDs != 0 OR _CaseIDs IS NOT NULL THEN Select testcase.id, testcase.TestCaseName From testcase WHERE FIND_IN_SET(testcase.id, _CaseIDs); END IF; END
编号 |测试用例名称 --: | :----------- 第658章测试1 第659章测试2 ✓CALL GetCaseFromStrList('658,659')
db小提琴here
【讨论】:
【参考方案2】:Find_IN_SET
正在返回字符串数组中第一个字符串的位置。因此,当您的字符串值为 658 时,它会返回 1,因此 WHERE FIND_IN_SET(testcase.id, @idCaseIDs)
为真,因为在 MySQL 中 1 代表了这一点。但是当字符串值为 659 时,它会返回 2,这不等于 true
。
请改为使用条件FIND_IN_SET(testcase.id, @idCaseIDs)>0
来获得您想要的结果。
CREATE DEFINER=`edmetrics`@`%` PROCEDURE `GetCaseFromStrList`(CaseIDs varchar(300))
BEGIN
SET @idCaseIDs = CaseIDs;
IF CaseIDs != 0 OR CaseIDs IS NOT NULL THEN
Select testcase.id, testcase.TestCaseName
From testcase
WHERE FIND_IN_SET(testcase.id, @idCaseIDs)>0;
END IF;
END
【讨论】:
以上是关于如何在MYSQL存储过程中的字符串动态列表中搜索字符串的主要内容,如果未能解决你的问题,请参考以下文章