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')
これ以外の方法はありますか?
それを行うためのネイティブ関数はありませんが、次のトリックを使用して目的を達成できます
WHERE CONCAT(",", `setcolumn`, ",") REGEXP ",(val1|val2|val3),"
MySQL関数 find_in_set()
は、文字列セット内の1つの文字列のみを検索できます。
最初の引数は文字列であるため、コンマ区切りの文字列を解析して文字列にする方法はありません(SET要素ではコンマを使用できません!)。 2番目の引数はSETです。これは、コンマで区切られた文字列で表されるため、find_in_set('a,b,c', 'a,b,c,d')
への希望は正常に機能しますが、文字列'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
たとえば、likeコマンドを使用することもできます。
where setcolumn like '%a,b%'
または
where 'a,b,c,d' like '%b,c%'
状況によっては動作する可能性があります。