Подтвердить что ты не робот

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.

Один из способов, который я вижу, - использовать ИЛИ

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')

Есть ли другой способ?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

where setcolumn like '%a,b%'

или

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

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

Ответ 4

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

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

Ответ 5

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

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