web-dev-qa-db-ja.com

mysqlは、数値がコンマ区切りリストにあるかどうかをチェックします

このようなテーブルがあります:

UID(int) NUMBERS(blob)
----------------------
1        1,13,15,20
2        3,10,15,20
3        3,15

そして、NUMBERと呼ばれるブロブに3と15があるかどうかをテストしたいと思います。 LIKE %%が使用できないことを確認できます

ID 2の行と3つのスコールブのみが選択されます...

28
Tillebeck

これも機能します:

SELECT * FROM table WHERE 3 IN (NUMBERS) AND 15 IN (NUMBERS)

iNを使用すると、コンマ区切りの文字列が検索されます。この二つ

WHERE banana IN ('Apple', 'banana', 'coconut')
WHERE 3 IN (2,3,6,8,90)

このページにある情報:

42
Tillebeck

最もきれいな解決策ではありませんが、動作します:

select
   UID
from
   YOUR_TABLE
where
   find_in_set('3', cast(NUMBERS as char)) > 0
   and
   find_in_set('15', cast(NUMBERS as char)) > 0

文字列比較であるため、入力パラメーターもcharにキャストする必要がある場合があります。

34
Björn

あなたは次のように試すことができます:

 SELECT * FROM table_name WHERE FIND_IN_SET('3', NUMBERS) AND  FIND_IN_SET('15', NUMBERS)
15

また、これが誰にとっても役立つかどうかを確認してください

MySQLのネイティブFIND_IN_SET()の制限を排除する拡張機能。この新しい拡張バージョンFIND_IN_SET_X()は、あるリストを別のリストと比較する機能を提供します。

つまり.

mysql> SELECT FIND_IN_SET_X('x,c','a,b,c,d'); -> 3 

詳細については、このリンクをチェックしてください。

8
Nilesh

あなたのための完全な機能

DELIMITER $$

CREATE FUNCTION `FIND_IN_SET_X`(inputList TEXT,targetList TEXT) RETURNS INT(11)
    DETERMINISTIC
BEGIN
  DECLARE limitCount INT DEFAULT 0 ;
  DECLARE counter INT DEFAULT 0 ;
  DECLARE res INT DEFAULT 0 ;
  DECLARE temp TEXT ;
  SET limitCount = 1 + LENGTH(inputList) - LENGTH(REPLACE(inputList, ',', '')) ;
  simple_loop :
  LOOP
    SET counter = counter + 1 ;
    SET temp = SUBSTRING_INDEX(SUBSTRING_INDEX(inputList, ',', counter),',',- 1) ;
    SET res = FIND_IN_SET(temp, targetList) ;
    IF res > 0 
    THEN LEAVE simple_loop ;
    END IF ;
    IF counter = limitCount 
    THEN LEAVE simple_loop ;
    END IF ;
  END LOOP simple_loop ;
  RETURN res ;
END$$

DELIMITER ;
3
Rodolfo Souza

このクエリを試してください:

SELECT UID FROM table WHERE NUMBERS REGEXP "[[:<:]](3|10)[[:>:]]"
0
Pradeep P

find_in_set_x

mysqlで新しい関数を作成し、以下に貼り付けます(ちなみに私の作業ではありません)

BEGIN
DECLARE limitCount INT DEFAULT 0;
DECLARE counter INT DEFAULT 0;
DECLARE res INT DEFAULT 0;
DECLARE temp TEXT;
SET limitCount = 1 + LENGTH(inputList) - LENGTH(REPLACE(inputList, ',',''));
simple_loop:LOOP
SET counter = counter + 1;
SET temp = SUBSTRING_INDEX(SUBSTRING_INDEX(inputList,',',counter),',',-1);
SET res = FIND_IN_SET(temp,targetList);
IF res > 0 THEN LEAVE simple_loop; END IF;
IF counter = limitCount THEN LEAVE simple_loop; END IF;
END LOOP simple_loop;
RETURN res;
END
0
user5127939