如何在 MYSQL 存储过程中的动态字符串列表中搜索字符串
How to search a string within a dynamic list of string in MYSQL Stored Procedure
在我的数据库中,我正在搜索这样的 ID 列表:
SELECT * from testcase where id in ('658', '659');
但是我怎样才能把它变成一个存储过程,它可以接受多个 ID?
在这个例子中我只有 '658', '659'
但这可能是 more/less.
我创建了一个存储过程,但是它失败了,因为我有两个或更多的 id,如果我把它变成一个像这样的字符串,'658, 659'
,那么它只能从 [= 中找到结果17=]:
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%:Whosebug 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,而不仅仅是两个。
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
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
CALL GetCaseFromStrList('658,659')
id | TestCaseName
--: | :-----------
658 | test1
659 | test2
✓
db<>fiddle here
在我的数据库中,我正在搜索这样的 ID 列表:
SELECT * from testcase where id in ('658', '659');
但是我怎样才能把它变成一个存储过程,它可以接受多个 ID?
在这个例子中我只有 '658', '659'
但这可能是 more/less.
我创建了一个存储过程,但是它失败了,因为我有两个或更多的 id,如果我把它变成一个像这样的字符串,'658, 659'
,那么它只能从 [= 中找到结果17=]:
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%:Whosebug 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,而不仅仅是两个。
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
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
CALL GetCaseFromStrList('658,659')
id | TestCaseName --: | :----------- 658 | test1 659 | test2 ✓
db<>fiddle here