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)