web-dev-qa-db-ja.com

複数の検索文字列を使用した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')

上記の例では、3つの文字列「a、b、c」で検索します。

私が見る1つの方法は、[〜#〜]または[〜#〜]を使用することです

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

これ以外の方法はありますか?

39

それを行うためのネイティブ関数はありませんが、次のトリックを使用して目的を達成できます

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

MySQL関数 find_in_set() は、文字列セット内の1つの文字列のみを検索できます。

最初の引数は文字列であるため、コンマ区切りの文字列を解析して文字列にする方法はありません(SET要素ではコンマを使用できません!)。 2番目の引数はSETです。これは、コンマで区切られた文字列で表されるため、find_in_set('a,b,c', 'a,b,c,d')への希望は正常に機能しますが、文字列'a,b,c'定義によるSET内-コンマが含まれています。

14

このカスタム関数を使用することもできます

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
1
user3740702

たとえば、likeコマンドを使用することもできます。

where setcolumn like '%a,b%'

または

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

状況によっては動作する可能性があります。

0
Jon Gabrielson