MySQL find_in_set具有多个searchstring

我发现find_in_set只能search一个string:

find_in_set('a', 'a,b,c,d') 

在上面的例子中,'a'是唯一用于search的string。

有什么办法可以使用find_in_settypes的function和多个stringsearch,如:

 find_in_set('a,b,c', 'a,b,c,d') 

在上面的例子中,我想通过三个string'a,b,c'进行search。

我看到的一种方法是使用OR

 find_in_set('a', 'a,b,c,d') OR find_in_set('b', 'a,b,c,d') OR find_in_set('b', 'a,b,c,d') 

除此之外还有别的方法吗?

没有本地的function,但你可以使用以下技巧来实现你的目标

 WHERE CONCAT(",", `setcolumn`, ",") REGEXP ",(val1|val2|val3)," 

MySQL函数find_in_set()只能search一组string中的一个string。

第一个参数是一个string,所以没有办法让你的逗号分隔的stringparsing成string(你不能在SET元素中使用逗号!)。 第二个参数是一个SET,这个SET又是用一个逗号分隔的string表示的,因此你希望find_in_set('a,b,c', 'a,b,c,d')正常工作, t根据定义在任何SET中查找string'a,b,c' – 它包含逗号。

你也可以使用like命令来实例:

 where setcolumn like '%a,b%' 

要么

 where 'a,b,c,d' like '%b,c%' 

这可能在某些情况下工作。

你也可以使用这个自定义函数

 CREATE FUNCTION SPLIT_STR( x VARCHAR(255), delim VARCHAR(12), pos INT ) RETURNS VARCHAR(255) RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos), LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1), delim, ''); DELIMITER $$ CREATE FUNCTION `FIND_SET_EQUALS`(`s1` VARCHAR(200), `s2` VARCHAR(200)) RETURNS TINYINT(1) LANGUAGE SQL BEGIN DECLARE a INT Default 0 ; DECLARE isEquals TINYINT(1) Default 0 ; DECLARE str VARCHAR(255); IF s1 IS NOT NULL AND s2 IS NOT NULL THEN simple_loop: LOOP SET a=a+1; SET str= SPLIT_STR(s2,",",a); IF str='' THEN LEAVE simple_loop; END IF; #Do check is in set IF FIND_IN_SET(str, s1)=0 THEN SET isEquals=0; LEAVE simple_loop; END IF; SET isEquals=1; END LOOP simple_loop; END IF; RETURN isEquals; END; $$ DELIMITER ; SELECT FIND_SET_EQUALS('a,c,b', 'a,b,c')- 1 SELECT FIND_SET_EQUALS('a,c', 'a,b,c')- 0 SELECT FIND_SET_EQUALS(null, 'a,b,c')- 0 

你可以用来从两个值中find匹配值

 SELECT * FROM table WHERE myvals in (a,b,c,d)