为了完成这里的一组答案,还有一个应该带有健康警告的答案。
这假定对问题的解释与:QuentinJadeau 完全相同。
也就是说,输入由一个字符串组成,该字符串包含一个逗号分隔的“类别”列表。
我已经测试过了。我试图设置一个“SQLFiddle”,但排在第二位。 ;-/ 我可以发布结果。
遗憾的是,它按预期工作,类似于提供的答案“MarkBaker”。唯一不同的是,这是数据库中的一个函数,而不是他做的方式。这是第二种最佳方式,因为当您可以动态生成完整的 SQL 查询时,您可以做更多的事情。 ;-/
我回答这个问题是因为我想写一些“有用”的“mysql”函数。
FIND_IN_COMMA_LIST 函数
它是一个“mysql”函数,它接受一个逗号分隔的源列表,将其拆分并将每个项目与目标逗号分隔列表进行比较,使用 mysql 的“find_in_set”函数。它返回找到的第一个匹配项。
已测试:服务器版本:Mysql 5.5.16
下面的示例将返回“x”
SELECT find_in_comma_list('1,2,x', 'a,b,c,9,x')
DROP FUNCTION IF EXISTS FIND_IN_COMMA_LIST;
DELIMITER $$
/*
needles => comma separated list of items
haystack => comma separated list of items
returns first item in 'needles' list that is found in the 'haystack' list
*/
CREATE
FUNCTION `testmysql`.`FIND_IN_COMMA_LIST` (needles VARCHAR(128), haystack VARCHAR(255))
RETURNS VARCHAR(255)
BEGIN
DECLARE which INT DEFAULT 0;
DECLARE result VARCHAR(255) DEFAULT '';
simple_loop: LOOP
SET which = which + 1;
SET result = SPLIT_STR(needles, ',', which);
IF result = '' THEN
LEAVE simple_loop;
END IF;
IF FIND_IN_SET(result, haystack) != 0 THEN
LEAVE simple_loop;
END IF;
END LOOP simple_loop;
RETURN result;
END$$
DELIMITER ;
它依赖于我在别处找到的另一个功能。
DROP FUNCTION IF EXISTS SPLIT_STR;
DELIMITER $$
CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
FUNCTION `testmysql`.`SPLIT_STR`(haystack VARCHAR(255), delim VARCHAR(16), which INTEGER)
RETURNS VARCHAR(255)
BEGIN
RETURN REPLACE(
SUBSTRING(SUBSTRING_INDEX(haystack, delim, which),
LENGTH(SUBSTRING_INDEX(haystack, delim, which - 1)) + 1),
delim, '');
END$$
DELIMITER ;