如何在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
CALL GetCaseFromStrList('658,659')
编号 |测试用例名称 --: | :----------- 第658章测试1 第659章测试2 ✓

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存储过程中的字符串动态列表中搜索字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 存储过程中使用动态 SQL

如何从 MySQL 中的存储过程返回字符串值?

mysql 存储过程 动态表名

如何在MySql中存储多选选项以便于搜索

如何评估 MySQL 存储的_function_ 中的简单数学公式?

存储过程中的mysql动态查询