MySQL find_in_set с несколькими поисковыми строками

Я обнаружил, что find_in_set выполняет поиск только по одной строке:

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

В приведенном выше примере «a» – единственная строка, используемая для поиска.

Есть ли способ использовать функцию find_in_set и поиск по нескольким строкам, например: –

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

В приведенном выше примере я хочу выполнить поиск по трем строкам «a, b, c».

Один из способов, который я вижу, – использовать 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') 

Есть ли другой способ, чем это?

для этого нет нативной функции, но вы можете достичь своей цели, используя следующий трюк

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

Функция MySQL find_in_set() может искать только одну строку в наборе строк.

Первый аргумент – это строка, поэтому нет возможности заставить ее разобрать строку, разделенную запятой, на строки (вы не можете использовать запятые в элементах SET вообще). Второй аргумент – это SET, который, в свою очередь, представлен разделенной запятыми строкой, поэтому ваше желание find_in_set('a,b,c', 'a,b,c,d') работает отлично, но, t найти строку 'a,b,c' в любом SET по определению – она ​​содержит запятые.

Вы также можете использовать эту настраиваемую функцию

 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 

Вы также можете использовать подобную команду:

 where setcolumn like '%a,b%' 

или

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

которые могут работать в некоторых ситуациях.

вы можете использовать для поиска значений соответствия из двух значений

 SELECT * FROM table WHERE myvals in (a,b,c,d) 
Interesting Posts
Давайте будем гением компьютера.