Ответ 1
для этого нет встроенной функции, но вы можете достичь своей цели, используя следующий трюк
WHERE CONCAT(",", `setcolumn`, ",") REGEXP ",(val1|val2|val3),"
Я нахожу, что 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.
Один из способов, который я вижу, - использовать ИЛИ
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')
работает отлично, но, конечно, не может найти строку 'a,b,c'
в любом SET по определению - она содержит запятые.
Вы также можете использовать подобную команду:
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
вы можете использовать для поиска значений соответствия из двух значений
SELECT * FROM table WHERE myvals in (a,b,c,d)